1. 遭人遗弃的goto

(1)高手潜规则:禁用goto

(2)项目经验:程序质量与goto出现的次数成反比

(3)最后的判决:将goto打入冷宫(1)循环语句的基本工作方式

【实例分析】goto副作用的分析

#include <stdio.h>
#include <malloc.h> void func(int n)
{
int* p = NULL; if( n < )
{
goto STATUS;
} p = (int*)malloc(sizeof(int) * n);//n<0时,将不被执行 STATUS:
p[] = n; //n<0时,p内存未申请,出现错误 free(p);
} int main()
{
printf("begin...\n"); printf("func(1)\n"); func(); printf("func(-1)\n"); func(-); printf("end...\n"); return ;
}

2. void的意义

(1)void修饰函数返回值和参数——为了表示“无”

  ①如果函数没有返回值,那么应该将其声明为void

  ②如果函数没有参数,应该声明其参数为void

任意参数 无参(用void声明)
#include<stdio.h>

f() //f()函数任意参数,返回值默认int型
{ } int main()
{
int i=f(,,) return ;
}
#include<stdio.h>

void f(void) //无参无返回值
{ } int main()
{
int i=f(,,) //error f(); //ok return ;
}

(2)不存在void变量

  ①C语言没有定义void究意是多大内存的别名,没有void标尺,无法在内存中裁出大小

#include<stdio.h>
void main()
{
void var; //error,不可以是void型的变量
void array[]; //error,同上
void* pv; //ok,void*的指针是可以的。
}

  ②小贴士:ANSI C:标准C语言的规范

扩展C: 在ANSI C的基础上进行了扩充

#include<stdio.h>

int main()
{
//在ANSI C编译器中无法通,支持GNU标准的gcc下为void大小为1,是合法的
printf("sizeof(void)=%d\n",sizeof(void));
}

(3)void指针的意义

  ①C语言规定只有相同类型的指针才可以相互赋值

  ②void* 指针作为左值用于“接收”任意类型的指针

  ③void* 指针作为右值使用时需要进行强制类型转换

int* pI = (int*)malloc(sizeof(int));
char* pC = (char*)malloc(sizeof(char));
void* p = NULL;
int* pni = NULL;
char* pnc = NULL; p = pI; //ok,void*指针p可接收任何类型的指针
pni = p; //error,void*须强制类型转换,即pni =(int*)p;
p = pC; //ok
pnc = p; //error,应为pnc=(char*)p;

【编程实例】通过void*实现MemSet函数

#include <stdio.h>

void MemSet(void* src, int length, unsigned char n)
{
unsigned char* p = (unsigned char*)src; int i = ; for(i=; i<length; i++)
{
p[i] = n;
}
} int main()
{
int a[];//这里可以是任何其他类型,如char a[5];double a[5]等。
int i = ; MemSet(a, sizeof(a), ); for(i=; i<; i++)
{
printf("%d\n", a[i]);
} return ;
}

3. 小结

(1)现代软件工程中禁用goto语句

(2)void是一种抽象的数据类型

(3)void类型不能用于定义变量

(4)void类型用于声明函数无参数或函数无返回值

(5)可以定义void*类型的指针,该指针可接受任意类型的指针值

第8课 goto 和 void 分析的更多相关文章

  1. 第8课 goto和void分析

    遭人遗弃的goto: C语言是一种面向过程的结构化语言,其中主要结构有三种,顺序执行.选择执行.循环执行.再复杂的程序也是由这三种结构组合而成的. goto破坏了结构化特性,使程序以第四种方式执行,结 ...

  2. C语言进阶——goto 和 void 的分析08

    遭人遗弃的goto: 高手潜规则:禁止使用goto 项目经验:程序质量与goto的出现次数成反比 最后的判决:将goto打入冷宫 程序示例1:(goto副作用分析) #include <stdi ...

  3. 第9课 - const 和 volatile分析

    第9课 - const和volatile分析 1. const只读变量 (1)const修饰的变量是只读的,本质上还是变量,并不是真正意义上的常量         ※※ const只是告诉编译器该变量 ...

  4. 第11课 - enum, sizeof, typedef 分析

    第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...

  5. 第10课 struct 和 union 分析

    1. struct的小秘密 (1)C语言中的struct可以看作变量的集合 (2)struct的问题——空结构体占用多的内存? [实例分析]空结构体的大小 #include <stdio.h&g ...

  6. 第9课 const和volatile分析

    1. const只读变量——(注意不是真正常量,只是告诉编译器不能出现在赋值号左边!) (1)const修饰的变量是只读的,本质还是变量 (2)const修饰的局部变量在栈上分配空间 (3)const ...

  7. 第10课 struct和union分析

    struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1.空结构体的大小为0 2.结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: #include ...

  8. 【第三课】kaggle案例分析三

    Evernote Export 比赛题目介绍 TalkingData是中国最大的第三方移动数据平台,移动设备用户日常的选择和行为用户画像.目前,TalkingData正在寻求每天在中国活跃的5亿移动设 ...

  9. 第2课 GUI程序实例分析

    1. GUI程序开发概述 (1)现代操作系统提供原生SDK支持GUI程序开发 (2)GUI程序开发是现代操作系统上的主流技术 (3)不同操作系统上的GUI开发原理相同 (4)不同操作系统上的GUI S ...

随机推荐

  1. Hazelcast介绍与使用

    Hazelcast 是一个开源的可嵌入式数据网格(社区版免费,企业版收费).你可以把它看做是内存数据库,不过它与 Redis 等内存数据库又有些不同.项目地址:http://hazelcast.org ...

  2. IOS缓存机制详解

    资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 为什么要有缓存 应用需要 ...

  3. Ideal-image-slider 幻灯片

    在线实例 实例演示 默认效果 实例演示 淡入淡出 实例演示 带链接 实例演示 项目导航 实例演示 带标题描述 实例演示 回调函数 实例演示 自定义切换 使用方法 <div class=" ...

  4. A除以B问题

    描述:本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入:输入在1行中依次给出A和B,中间以1空格分隔. 输出: ...

  5. Js中的this指向问题

    函数中的this指向和当前函数在哪定义的或者在哪执行的都没有任何的关系分析this指向的规律如下: [非严格模式]1.自执行函数中的this永远是window [案例1] var obj={ fn:( ...

  6. JS中检测数据类型的四种方法

    1.typeof 用来检测数据类型的运算符->typeof value->返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."st ...

  7. Android拍照保存在系统相册不显示的问题

    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(new File(& ...

  8. hadoop实战–搭建eclipse开发环境及编写Hello World

    原创文章,转载请注明: 转载自工学1号馆 欢迎关注我的个人博客:www.wuyudong.com, 更多云计算与大数据的精彩文章 1.在eclise中安装hadoop的插件并配置 在上篇文章<编 ...

  9. 大家一起和snailren学java-(四)初始化与清理

    初始化和清理,是一个生命周期的起始.在java中,对象的初始化和对象的回收是怎样的呢? 在开发c++的时候,有构造器的概念.即对象的创建,首先默认调用构造器进行初始化.在java中也有“构造器”.ja ...

  10. 介绍一种css水平垂直居中的方法(非常好用!)

    这次介绍一下一个水平垂直居中的css方法,这个方法可以说是百试百灵,废话不多说,直接附上代码: html,body{ width:100%; height:100%; } 你需要居中的元素{ posi ...