c语言语法陷阱总结
来源:互联网 发布:ios10蜂窝数据开关 编辑:程序博客网 时间:2024/05/01 15:56
学习C语言也有一段时间了,关于语法上的错误,现在基本上也没犯过,不过,我还是想小结一下。
一、优先级问题
运算优先级的问题,其实在背乘法表,的时候就已经开始接触了。那时候我们知道在加减乘除的混合运算中,先算乘除,再算加减,如果遇到括号,先算括号里的内容,这就是优先级问题。
那么在 c语言中,我们也有很多运算,有运算就有优先级的问题,关于优先级的问题,下面的表中会有一些总结。
从这个表中我们可以看出很多问题,首先是()的优先级最大,所以,如果你想写一下表达式,但是有不清楚优先级的具体大小,最保险的方法还是在你想要的运算顺序中合适的加上(),这样就能保证逻辑的正确运行。然后是单目运算符的优先级大于双目优先级,大于三目运算符优先级。逻辑运算符优先级 > 关系运算符优先级。在所有的运算符中,逗号的优先级最低,其次是赋值运算符。
二、分号问题
记得刚学C语言的时候,对于什么时候加分号,什么时候不加分号,还是考虑可好久的,现在,我把这个问题总结一下。
其实总结起来内容很少,判断语句后面没有分号,正常的语句都有分号。
分号问题多了少了都会有很多问题,比如:
if (x[i]>big); big=x[i];
这里显然if语句后面多了一个分号,那后果就是编译器所呈现的内容和预期的大不相同,如果你本来想写成:
if (x[i]>big) big=x[i];
那么结果这能是
if (x[i]>big){} big=x[i];
如果,要是少写了一个分号,还是有很多问题,比如:
if (n<3) returndata=x[0];time=x[1];code=x[2];
显然,return后面少了一个分号,如果你本来想什么也不返回,那么写成这样之后,你会得到的结果是将data=x[0];返回。
上面举的例子都是编译器没有报错的情况下,当然大多数情况下编译器都是会报错的,不过,这个问题还是得高度注意。
三、else 问题
在说这个问题之前,还是先来看一个程序片段吧:
if (x==0) if(y==0)error();else{ z=x+y; f(&z);}
这个程序的本意是x=0时,除非y=0,然后调用error函数,否则不做任何处理;x!=0时,程序先将x与y的和赋给z,然后以z的地址为参数来调用函数f。
但是实际运行的结果却大不相同,大概是这个样子的:
if (x==0){ if(y==0) error(); else{ z=x+y; f(&z);}}
也就是说,当x!=0时,不做任何处理,显然和写程序的初衷不同,那么我们应该怎么解决这个问题呢?
先来找不同吧:
if (x==0){ if(y==0) error();}else{ z=x+y; f(&z);}
是的,就是在第一个if后加了一对{},虽然if中只有一条语句,但还是得加上,就是为了避免这种问题。
- c语言语法陷阱总结
- C语言陷阱学习总结
- C语言语法总结
- C语言语法“陷阱”——函数声明
- C语言运算符优先级理解记忆,语法“陷阱”
- C++/Cli语言语法总结
- C语言基本语法总结
- C陷阱与缺陷之语法陷阱
- c陷阱与缺陷 语法陷阱有感
- 【c】c语言语法知识点总结 1
- C语言陷阱
- c 语言陷阱
- c 语言陷阱
- C语言 陷阱
- C语言陷阱---丢三落四
- c语言数据类型陷阱
- C语言---strlen陷阱
- 《C语言的缺陷与陷阱》读后总结
- 初始Android动画
- Ubuntu下配置caffe(CPU版本,无CUDA)
- 计算机网络:数据链路层:有线和无线网络
- 氨基酸系统命名
- 面试之mybatis和hibernate的区别
- c语言语法陷阱总结
- 千万级规模高性能、高并发的网络架构经验分享
- ROS机器人程序设计(原书第2版)补充资料 (拾) 第十章 使用MoveIt!
- [2016/12/4]ACM校赛后感受
- shell脚本之数值计算
- 封装的知识点总结
- javax实现websocket通信
- 机房收费系统---项目开发计划
- CCF-最大矩形