第8课 goto 和 void 分析
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型 |
#include<stdio.h> void f(void) //无参无返回值 |
(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 分析的更多相关文章
- 第8课 goto和void分析
遭人遗弃的goto: C语言是一种面向过程的结构化语言,其中主要结构有三种,顺序执行.选择执行.循环执行.再复杂的程序也是由这三种结构组合而成的. goto破坏了结构化特性,使程序以第四种方式执行,结 ...
- C语言进阶——goto 和 void 的分析08
遭人遗弃的goto: 高手潜规则:禁止使用goto 项目经验:程序质量与goto的出现次数成反比 最后的判决:将goto打入冷宫 程序示例1:(goto副作用分析) #include <stdi ...
- 第9课 - const 和 volatile分析
第9课 - const和volatile分析 1. const只读变量 (1)const修饰的变量是只读的,本质上还是变量,并不是真正意义上的常量 ※※ const只是告诉编译器该变量 ...
- 第11课 - enum, sizeof, typedef 分析
第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...
- 第10课 struct 和 union 分析
1. struct的小秘密 (1)C语言中的struct可以看作变量的集合 (2)struct的问题——空结构体占用多的内存? [实例分析]空结构体的大小 #include <stdio.h&g ...
- 第9课 const和volatile分析
1. const只读变量——(注意不是真正常量,只是告诉编译器不能出现在赋值号左边!) (1)const修饰的变量是只读的,本质还是变量 (2)const修饰的局部变量在栈上分配空间 (3)const ...
- 第10课 struct和union分析
struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1.空结构体的大小为0 2.结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: #include ...
- 【第三课】kaggle案例分析三
Evernote Export 比赛题目介绍 TalkingData是中国最大的第三方移动数据平台,移动设备用户日常的选择和行为用户画像.目前,TalkingData正在寻求每天在中国活跃的5亿移动设 ...
- 第2课 GUI程序实例分析
1. GUI程序开发概述 (1)现代操作系统提供原生SDK支持GUI程序开发 (2)GUI程序开发是现代操作系统上的主流技术 (3)不同操作系统上的GUI开发原理相同 (4)不同操作系统上的GUI S ...
随机推荐
- 为阿里云存储开发的PHP PEAR 包:Services_Aliyun_OSS
阿里云开放存储服务 OSS:用于存储图片.apk等静态资源,使用阿里云带宽,不占用开发者服务器带宽. 阿里云官方PHP SDK: http://aliyun.com/product/oss/#help ...
- 使用WCF对外提供接口
本篇将通过WCF以webservices的方式对外提供接口.同时使用NUnit对webservices中的方法进行单元测试. 开发契约 contract Contract项目为类库项目,该项目下会包含 ...
- Git的安装和使用记录
Git是目前世界上最先进的分布式版本控制系统(没有之一),只用过集中式版本控制工具的我,今天也要开始学习啦.廖雪峰的git教程我觉得很详细了,这里记录一下步骤以及我终于学会用Markdown了,真的是 ...
- Ettercap中间人攻击--介绍
前言 Ettercap有四种界面:Text,Curses,GTK2,Daemonize. -T 命令行界面,只显示字符.通常与配套的参数有-q(安静模式),加上该选项,则不会显示抓到的数据包 ...
- The URL "filename" is invalid. It may refer to a nonexistent file or folder, or refer to a valid file or folder that is not in the current Web
Sharepoint Error : The URL "filename" is invalid. It may refer to a nonexistent file or fo ...
- 用Gradle构建时,将密码等敏感信息放在build.gradle之外
密码 在做版本release时你app的 build.gradle你需要定义 signingConfigs.此时你应该避免以下内容: 不要做这个 . 这会出现在版本控制中. signingConfig ...
- UIlable 属性详用
我的好朋友给我制定了一个新的学习方法,从新的看每个控件,去了解他的每个属性,方法来让自己对oc的认识更加充实 今天重新认识一下UILable 的属性lable的阴影设置: 阴影的偏移量是以lable中 ...
- cornerstone 使用
svn 使用方法 Check Out 下载的文件会与源文件产生一个working copy与源文件关联
- iOS网络-02-数据解析(JSON与XML)
数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...
- iOS开发之网络编程--使用NSURLConnection实现文件上传
前言:使用NSURLConnection实现文件上传有点繁琐. 本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...