標籤:
1. 使用 e1=e2的賦值方式 作為 條件陳述式內部的判斷,請使用顯示的判斷不使用:
if( x =y ) foo();
而使用:
if( (x = y) != 0) foo();
2. 注意編碼規範,一定要在賦值號 “=”兩邊,寫上空格,以避免如下的 無意識錯誤。
本來想寫成:
a = -1;
但是沒有加空格:
a=-1;
這會被編譯器翻譯成:(這裡猜測應該是很老的編譯器才有這種解釋,現在都是用 “+=”和“-=”運算子)
a = a - 1;
3.進位的表示
int a ;a = 141; /*十進位*/printf("a:%d \r\n" ,a);a = 0215; /*八進位,以數字“0”開頭*/printf("a:%d \r\n" ,a);a = 0x8D; /*十六進位*/printf("a:%d \r\n" ,a);
現在 ”
0195“ 的表示方法會被編譯器報錯
a = 0195; /*八進位*/
4.字元與字串
首先說明的是,對於字串常量,是儲存在常量區,唯讀資料區 .rodata裡面的。 (推薦一篇講變數儲存位置的文章http://blog.163.com/[email protected]/blog/static/404330272007102012451957/) 並且,對於同樣的字串,是只存在一個副本的,在尋找字串的時候,會先去唯讀資料區尋找有無對應字串的儲存地址,有的話,直接輸出;沒有才會建立新的字串:
char * str = "test string address.";char * str1 = "test string address.";cout<<hex<<(int)( str)<<endl;/*以16進位無符號形式輸出*/cout<<(int )(str1)<< endl;cout<<(int )("test string address.")<< endl;;printf("Ox%x \r\n" ,str); /*以16進位無符號形式輸出*/printf("Ox%x \r\n" ,str1);printf("Ox%x \r\n" ,"test string address.");
分別用C和C++的輸出資料流,輸出”test string address.”的地址,發現是一樣的。
對於printf()函數來說,內部傳入的是字串的地址,所以要分清楚
字元 (‘n‘ ‘\r‘……用單引號,傳遞的是值,字元等價於一個整數,對應其ASCII碼)和
字串("n","\r"……用雙引號,傳遞的是地址,這個從上面的例子,直接把"test string address." 傳給printf()函數可以看出)的區別
printf(‘\n‘ ); /*報錯*/printf("\n" );
5. 用字元給int賦值
int a ;a = ‘yes‘ ;
這時候,相當於把 int 變數當作一個 char [4]的數組,‘yes‘會被高位對高位,低位對低位的填充進a中。
cout <<(char )a<< endl;cout <<(char )(a>>8)<< endl;cout <<(char )(a>>16)<< endl;cout <<(char )(a>>24)<< endl;
如果字元不足4個,那麼高位補0;
cout <<(char )a<< endl;cout <<(char )(a>>8)<< endl;cout <<(char )(a>>16)<< endl;cout <<(int )(a>>24)<< endl;
如果字元過多,則會報錯。
int a ;a = ‘abcde‘ ;
C陷阱與缺陷 第一章