c语言语法陷阱总结

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值