学习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)
return
data=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中只有一条语句,但还是得加上,就是为了避免这种问题。