c语言语法陷阱总结

来源:互联网 发布:ios10蜂窝数据开关 编辑:程序博客网 时间:2024/05/01 15:56

学习C语言也有一段时间了,关于语法上的错误,现在基本上也没犯过,不过,我还是想小结一下。

一、优先级问题

运算优先级的问题,其实在背乘法表,的时候就已经开始接触了。那时候我们知道在加减乘除的混合运算中,先算乘除,再算加减,如果遇到括号,先算括号里的内容,这就是优先级问题。
那么在 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中只有一条语句,但还是得加上,就是为了避免这种问题。

0 0