C语言陷阱之优先级学习小结

很多时候跟别人交流介绍自己工作的时候,经常听到别人说自己精通C语言。其实,我自己有时候自我介绍的时候也会这么说,不过随着自己工作的过程中各种书籍、文档等一些列的资料看下来,越觉得自己肤浅。其实,很多最基础的东西我还没有掌握。

今天看C语言陷阱的时候看到一个简单的小陷阱,如果是我自己写代码的话很可能就陷进去了,幸运的是这么多年来我的代码中确实是没有用到过这个操作。

测试代码如下:

  1 #include "stdio.h"

  2 

  3 int flag1 = 1;

  4 int flag2 = 2;

  5 

  6 int main()

  7 {

  8     if(flag1 & flag2)

  9     {

 10         printf("bit equal!\n");

 11     }

 12     else

 13     {

 14         printf("bit not equal!\n");

 15     }

 16 

 17     return 0;

 18 }

 19 


编译运行如下:

GreydeMac-mini:exp01 greyzhang$ gcc exp01.c 

GreydeMac-mini:exp01 greyzhang$ ./a.out 

bit not equal!


为了可读性,修改代码如下:

  1 #include "stdio.h"

  2 

  3 int flag1 = 1;

  4 int flag2 = 2;

  5 

  6 int main()

  7 {

  8     if(flag1 & flag2 == 1)

  9     {

 10         printf("bit equal!\n");

 11     }

 12     else

 13     {

 14         printf("bit not equal!\n");

 15     }

 16 

 17     return 0;

 18 }


编译运行如下:


GreydeMac-mini:exp01 greyzhang$ gcc exp01.c 

exp01.c:8:11: warning: & has lower precedence than ==; == will be evaluated

      first [-Wparentheses]

        if(flag1 & flag2 == 1)

                 ^~~~~~~~~~~~

exp01.c:8:11: note: place parentheses around the '==' expression to silence this

      warning

        if(flag1 & flag2 == 1)

                 ^

                   (         )

exp01.c:8:11: note: place parentheses around the & expression to evaluate it

      first

        if(flag1 & flag2 == 1)

                 ^

           (            )

1 warning generated.

GreydeMac-mini:exp01 greyzhang$ ./a.out 

bit not equal!


啊,这个结果有些出乎意料。不过,我们前面提到的陷阱问题倒是被编译器发掘出来了,我用的编译器是Mac自带的兼容gcc的编译器。不知道gcc的编译器中是否也会有相应的处理?当然,再怎么说这毕竟是编译器的处理,不同的编译器对此或许会有不同的处理方式。Anyway,这个陷阱还是确确实实存在的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值