學習C++兩個年頭了,在學習的過程中經常碰到一些看似很簡單,但卻經常被人忽略的文法問題。在此我整理一下自己在學習過程中範的一些小錯誤,錯誤雖小,但卻必須重視。
第一個問題:
#include <vector>#include <iostream>using namespace std;void main(){int i = 2, j;j = i++ + ++i;cout << j <<endl; //等於6i = 2;i = i++ + ++i;//換((i++) + (++i));此種形式,依然等於7cout << i <<endl; //等於7,為什麼等於7呢?}
自認為大蝦的朋友們,可以試試能看出問題嗎?
根據cyz108D這位哥們的評論,我總結了原因如下:
問題是由於i++引起的,i = i++ + ++i會先執行i = 右邊的運算式,最後再i++操作,所以結果就出現了一個6,一個7。
總結:操作符優先順序問題。
第二個問題:
UINT uN = 3;
BOOL bRt = (-1 < uN);
bRt結果為FALSE。原因估計很多朋友,都能說的出來。
無符號版本和有符號版本的區別就是無符號類型能儲存2倍於有符號類型的正整數資料,比如16位系統中一個int能儲存的資料的範圍為-32768~32767,而unsigned能儲存的資料範圍則是0~65535。由於在電腦中,整數是以補碼形式存放的。根據最高位的不同,如果是1,有符號數的話就是負數;如果是無符號數,則都解釋為正數。
總結:切記不要用無符號整型和負數比較。因為程式會將-1轉換成無符號整型後再和無符號整型作比較,-1轉成無符號整型後會變成很大的數 。
第三個問題:
與或優先順序問題,看看各位大蝦有多少和我犯同樣錯誤的?
x = 1, y = 0, z = -1;
q = ++x || ++y && ++z;
q會等於0?還是1?
你認為呢?
看分析:
優先順序 操作符
1 () [] -> .
::
! ~ ++ --
2 - (unary) * (dereference)
& (address of) sizeof
3 ->* .*
4 * (multiply) / %
5 + -
6 << >>
7 < <= > >=
8 == !=
9 & (bitwise AND)
10 ^
11 |
12 &&
13 ||
14 ? :
15 = += -= etc.
16 ,
注意:由於||和&&都是從左向右執行,而&&優先順序大於||,所以實際執行效果是q=(++x)||(++y
&& ++z);
所以q的結果是1。
我原先一直停留在&&和||的優先順序相同,共同存在時都是自左向右執行,結果就成了0.
說了慚愧啊。。