原創文件,歡迎閱讀,禁止轉載。
問題描述
你見過一個這樣的bool值嗎,判斷 var 和 !var 都是成立的,今天被我遇到了,是在一個坑里遇到的。
今天調試了一個程序,發送一個網絡消息,結果總是得不到回應,深入排查發現,竟然是因為一個具有4年工作經驗的同事張某的不良編碼風格埋下的坑,真是汗。
在C++中,bool值的隨機值可能是任意的,不一定是我們以為的0/1,
而不同的系統中對bool值的判斷也是搞笑。
我把代碼簡化一下來說明問題。
代碼演示
typedef struct { bool resp; //是否反饋 char* ret; //執行結果 }ARG; int main(int argc,char* argv[]) { ARG argSt; //argSt.resp=true;//這里的bool值不初始化 printf("resp:%d\n",argSt.resp); if( argSt.resp ) { puts("YES"); } if( !argSt.resp ) { puts("NO"); } }
Windows的結果:
resp:44 YES
linux的結果:
resp:112 YES NO
結果解釋:
從運行結果看出,Windows沒問題,如果未初始化,debug版直接中止進程。
而linux中:
如果是int類型,則0就是假,其他都是真;而bool類型卻不是這樣;bool類型如果未初始化,則判斷真也成立,假也成立,完全是亂來。如果初始化了,不管初始化為多少,都能像int判斷真假一樣了。
這里說清楚了這個問題,應該算是運行庫的缺陷吧。
總結:
必須有良好的編碼風格,未初始化這種毛病是不能容忍的。
原創文件,歡迎閱讀,禁止轉載。