C语言进阶——goto 和 void 的分析08
遭人遗弃的goto:
- 高手潜规则:禁止使用goto
- 项目经验:程序质量与goto的出现次数成反比
- 最后的判决:将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); STATUS:
p[] = n; free(p);
} int main()
{
printf("begin...\n"); printf("func(1)\n"); func(); printf("func(-1)\n"); func(-); printf("end...\n"); return ;
}
在函数中,从第8行到第16行本来是顺序执行的,可是当满组if条件的时候,就会破环这个程序原来的结构,导致出现错误。
goto语句就介绍到这里,下面来讲一下void:
void修饰函数返回值和参数:
- 如果函数没有返回值,那么就应该将其声明为void
- 如果函数没有参数,应该声明其参数为void
程序示例2:
#include<stdio.h> f()
{ } int main()
{
int i= f(,,,);
printf("%d\n",i);
return ;
}
上面这段程序,可能会有人认为它在编译的时候会报错,其实不然:
- 当函数没有返回值的时候,会默认返回一个int类型,也就是说你可以在这个函数里面加上一条return用于返回一个int语句,但是如果你不加的话,编译器会默认给你返回一个1。
- 当函数的参数列表没有任何参数,且没有声明为void,默认可以接受任意多个参数
为什莫会这样呢,因为C语言不是一种强类型的语言。
程序示例3:
#include<stdio.h> void f(void)
{
return ;
} int main()
{
int i= f(,,,);//error
printf("%d\n",i);
return ;
}
这段代码是将示例2中的代码稍加修改得到的,现在这段代码是不可以通过编译的。
void的意义,有人想到,void既然是一种类型,那么我们是否可以像使用其他类型,比如说int,char 一样的使用它来创建变量呢?答案是否定的,你可以将void理解为一种抽象类型。
不存在void普通变量(指针变量例外),C语言中没有定义void究竟是多大内存的别名,也就是说没有void标尺,无法在内存中裁剪出void对应的变量。
小贴士:
ANSIC:标准C语言规范
扩展C:在ANSIC的基础上进行了扩充
程序示例4:
#include<stdio.h> int main()
{
printf("%d\n",sizeof(void));
return ;
}
上面这段代码在ANSIC编译器中无法通过编译,但是对于支持GNU标准的额gcc编译器而言是合法的。(但是我们最好是按照C语言标准来学习C语言,所以我们可以认为上面这段代码是不合法的,有的编译器生产厂家认为标准C的特性不够,是自己加上去的)
void虽然不能定义普通的变量,但是可以创建指针变量:
- C语言规定只有相同类型的指针才可以相互赋值
- void * 指针作为左值用于 “接受” 任意类型的指针
- void* 指针作为右值使用时需要进行强制类型转换
程序示例5:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *pi = (int *) malloc(sizeof(int));
char *pc = (char *)malloc(sizeof(char));
void *p=NULL;
int *pni=NULL;
char * pnc=NULL; p=pi; //ok
pni =p; //error p=pc; //ok
pnc = p; //error return ;
}
在标准C语言中12 和 15 行会报错,但是有的编译器会扩展C语言规范,所以上述代码在你的编译器中有可能时通过的。
程序示例6:
#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[];
int i = ; MemSet(a, sizeof(a), ); for(i=; i<; i++)
{
printf("%d\n", a[i]);
} return ;
}
MeMset这个函数用void类型的指针接受一个int(也可以接受其他类型的指针),然后将其强制转化为unsigned char 类型的指针,将其每个字节都设置为0,最后在主函数会输出 5 个0,因为每一个字节都被设置为0,所以四个为0的字节组合的一个int类型的值也是0,你也可以将他的每个自己设置为其他的数。
小结:
- 现代软件工程中禁止使用goto语句
- void是一种抽象类型的数据类型
- void类型不能用于定义变量
- void类型用于声明函数的无参数
- void类型用于用于声明函数的无返回值
- 可以定义void* 类型的指针
- void* 类型的子真可以接受任意类型的指针值
C语言进阶——goto 和 void 的分析08的更多相关文章
- C语言进阶_goto与void解析
世间真正温煦的春色,都熨帖者大地,潜伏在深谷. 一.简介 goto与void是两个不常用的关键字,C语言中的Goto关键字传承字汇编语言,使用方法也与汇编语言相同.void是类型关键字,可修饰函数和变 ...
- 《C语言进阶剖析》课程目录
<C语言进阶剖析>学习笔记 本文总结自狄泰软件学院唐佐林老师的<C语言 ...
- 【R笔记】R语言进阶之4:数据整形(reshape)
R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...
- R语言入门级实例——用igragh包分析社群
R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ...
- 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01
书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...
- 第8课 goto 和 void 分析
1. 遭人遗弃的goto (1)高手潜规则:禁用goto (2)项目经验:程序质量与goto出现的次数成反比 (3)最后的判决:将goto打入冷宫(1)循环语句的基本工作方式 [实例分析]goto副作 ...
- 第8课 goto和void分析
遭人遗弃的goto: C语言是一种面向过程的结构化语言,其中主要结构有三种,顺序执行.选择执行.循环执行.再复杂的程序也是由这三种结构组合而成的. goto破坏了结构化特性,使程序以第四种方式执行,结 ...
- C语言进阶——enum, sizeof, typedef 分析11
枚举类型的使用方法: enum是C语言的 一种自定义类型 enum值是可以根据需要自定义的整型值 第一个enum的值默认为0 默认情况下的enum值是在前一个定义值的基础上加 1 enum类型的变量只 ...
- C语言进阶—— 逻辑运算符分析15
印象中的逻辑运算符: ---学生:老师,在我的印象中,逻辑运算符用在条件判断的时候,真挺简单的,还有必要深究吗? ---老师:逻辑运算符确实在条件判断的时候用的比较多,但是并不能说简单... 请思考下 ...
随机推荐
- vue-2.4.0-添加的新东东
组件内新增实现属性继承 VUE中一个比较令人烦恼的事情是属性只能从父组件传递给子组件.这也就意味着当你想向嵌套层级比较深组件数据传递,只能由父组件传递给子组件,子组件再传递给孙子组件...像下面这样 ...
- 选择、循环与函数结构:MATLAB VS Python
选择.循环与函数结构:MATLAB VS Python 整理基本的程序控制结构,主要是选择 和 循环. 1.MATLAB选择结构 (1)单分支if语句格式: if 条件 语句组 end (2)双分支i ...
- 轻松完成excel读写操作- 基于POI的框架BingExcel的使用(2)
在进行 类转换时候,系统默认注册了一些转换器,当然你也可以自定局部或者全局的转换器.下面进行具体使用说明 java类说明 对应的java实体类,其属性必须要有__@CellConfig__注解,此注 ...
- Android 给EditText添加下划线
在安卓高版本,默认是有下划线的,其默认下划线的颜色是由其主题颜色来控制的! 控制如下: <style name="AppTheme" parent="Theme.A ...
- mongoose添加属性问题
在项目中遇到这样一个问题. 项目地址: https://github.com/ccyinghua/vue-node-mongodb-project/blob/master/07-shoppingCar ...
- T-SQL在线格式化工具
http://www.dpriver.com/pp/sqlformat.htm?ref=g_wangz
- spring-mabatis整合的配置文件
1.spring.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- IOS 运行循环
. 运行循环========================================在iOS的应用程序中,应用程序启动之后,系统即会创建一个运行循环监听用户的交互. 以下代码其本质是在运行循环 ...
- 虚拟内存映射 段分割 vm_area_struct
http://www.cnblogs.com/huxiao-tee/p/4660352.html linux内核使用vm_area_struct结构来表示一个独立的虚拟内存区域,由于每个不同质的虚拟内 ...
- 深入理解MyBatis-Spring中间件(spring/mybatis整合)
转:http://blog.csdn.net/fqz_hacker/article/details/53485833 Mybatis-Spring 1.应用 mybatis是比较常用的数据库中间件,我 ...