第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 ...
随机推荐
- C++ 面向对象的三个特点--继承与封装(一)
面试的时候经常会有很多概念性的东西,许久不用都会很生疏,特意整理一下方便自己以后不记得了可以查看一下,也顺便帮助自己复习一下. 概念 继承是面向对象程序设计的一个重要特性,它允许在既有类的基础上创建新 ...
- web api 限制单个IP在一定时间内访问次数
ps:下面实例是每隔30秒访问次数不超过3次 1.Filter: using Infrastructure.Log; using Infrastructure.Web; using Lemon.Sta ...
- [ html canvas 模仿支付宝刮刮卡效果 ] canvas绘图属性 模仿支付宝刮刮卡效果实例演示
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- Web安全开发注意事项
1.sql注入:这个很常规了,不要拼字符串以及过滤关键字都可以防住,需要注意的是,Cookie提交的参 数也是可以导致注入漏洞的.2.旁注:就是说在保证自己的程序没问题的同时,也要保证同台服务器的其他 ...
- 安卓开发_浅谈ListView(SimpleAdapter数组适配器)
安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...
- quote、cite、refer的区别
quote指“直引”,直接引用原文,不做丝毫修改. cite指“间引”,引用时不需要相同的词. refer指消化原来的思想,完全不抄.
- 长文件名导致的0x80070057
今天遇到件怪事. 把一个视频集(86G)从电脑硬盘转移动硬盘的时候里面时报里面的两个文件夹里的视频和字幕不能复制 错误代码0x80070057 这个视频集是从校内PT是下下来的,电脑是联想Y560-w ...
- 【PHP】$_POST, $HTTP_RAW_POST_DATA, and php://input
1.HTML <form> enctype Attribute application/x-www-form-urlencoded 传送之前所有的字符都会被encoded,(spaces ...
- flask中'bool' object has no attribute '__call__'问题
#写flask时报错 <ul class="nav navbar-nav"> <li><a href="/">Home< ...