分号不是个“随便的人”
2016-03-09 15:32
274 查看
分号是个很不起眼的东西,但在C语言编程里面,它的作用不可忽视,多写与漏写都会造成不可预料的错误,下面就列举一些常见的错误。
1、多谢了分号
if或while语句块内如果只有一条语句,那么可以省略大括号的书写,然而,当他们的条件判断框后面不小心加了一个”;”时,会使本来想要在if或while条件成立时执行的语句替换成了一个空语句,把原来要执行的语句“挤到了”if或while语句块外面,使其不管if或while的条件成立与否,都会执行
上面程序的本意是当a = 0时,输出a = 0;当a != 时,输出a != 0,a = n(n是此时a的值)
但因为if的判断框(一对())后面多写了一个“;”,编译器就把”;“这个空语句当做了它后面要执行的语句,使printf(“a = %d\n”, a);无论如何都会执行,改变了程序的初衷。
2、漏写了分号
①当一个自定义的类型在定义时忘了在结尾加上分号,且它的下面跟的是一个没有写返回值的函数时,那么编译器会误把这个自定义的类型当成函数的返回值类型,造成不可预料的错误
上面这段代码,函数fun()在设计时是不给返回值的,然而因为定义结构体类型时忘记在结尾处加分号了,使此结构体类型成了函数fun()的返回值类型。
②少了一个分号使函数的返回值发生改变,并对函数逻辑发生错误。
假定上面的代码是一个函数的一部分,那么本意是当a = 0时,函数直接返回调用函数,a != 0 时,函数执行return下面的四条语句,但因为return后面漏写了分号,错误的把a += 10作为返回值,使a = 0时返回10,当a != 0时,函数也只能执行a += 10/下面的三条语句。使函数的逻辑发生了很大的改变。
1、多谢了分号
if或while语句块内如果只有一条语句,那么可以省略大括号的书写,然而,当他们的条件判断框后面不小心加了一个”;”时,会使本来想要在if或while条件成立时执行的语句替换成了一个空语句,把原来要执行的语句“挤到了”if或while语句块外面,使其不管if或while的条件成立与否,都会执行
int main() { int a = 0; if (a == 0); printf("a = %d\n", a); printf("a != 0, a = %d\n", a); system("pause"); return 0; }
上面程序的本意是当a = 0时,输出a = 0;当a != 时,输出a != 0,a = n(n是此时a的值)
但因为if的判断框(一对())后面多写了一个“;”,编译器就把”;“这个空语句当做了它后面要执行的语句,使printf(“a = %d\n”, a);无论如何都会执行,改变了程序的初衷。
2、漏写了分号
①当一个自定义的类型在定义时忘了在结尾加上分号,且它的下面跟的是一个没有写返回值的函数时,那么编译器会误把这个自定义的类型当成函数的返回值类型,造成不可预料的错误
struct P { char c; int i; double d; } fun() { printf("fun()是一个无参无返回值的函数\n"); return; }
上面这段代码,函数fun()在设计时是不给返回值的,然而因为定义结构体类型时忘记在结尾处加分号了,使此结构体类型成了函数fun()的返回值类型。
②少了一个分号使函数的返回值发生改变,并对函数逻辑发生错误。
int a = 0; if (a == 0) return a += 10; a -= 10; a *= 10; a /= 10;
假定上面的代码是一个函数的一部分,那么本意是当a = 0时,函数直接返回调用函数,a != 0 时,函数执行return下面的四条语句,但因为return后面漏写了分号,错误的把a += 10作为返回值,使a = 0时返回10,当a != 0时,函数也只能执行a += 10/下面的三条语句。使函数的逻辑发生了很大的改变。
相关文章推荐
- 自制控件2 —— 自制控件 仿qq侧滑菜单
- InfluxDB 开源分布式时序、事件和指标数据库
- Android Material Design(1) RecyclerView 的使用
- java异常
- 常见SQL语句
- php ajax json jquery 记录
- 1926: [Sdoi2010]粟粟的书架 主席树+二分答案
- android权限大全
- Can't create handler inside thread that has not called Looper.prepare()
- vim实现全选功能
- 机器视觉之 ICP算法和RANSAC算法
- 过3s弹出广告条,点叉号关闭
- ztree addNode editName removeNode
- POJ 3694:桥
- strcpy 详解
- HDOJ-1394 Minimum Inversion Number
- failed: Access denied for user 'root'@'localhost' (using password: YES) at /usr/bin/innobackupex lin
- CentOS6.3编译安装 Erlang 和 RabbitMQ3.4.3
- 【iOS】CoreImage原生二维码生成(二)一个方法生成带logo的二维码
- jmeter名词解释之时间(Elapsed Time/ Latency Time/Connection Time)