很多時候跟別人交流介紹自己工作的時候,經常聽到別人說自己精通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 return0;
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 return0;
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,這個陷阱還是確確實實存在的。
新聞熱點
疑難解答