2012-07-20 20 views
16
#include <iostream> 

using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int i=-5; 
    while(~(i)) 
    { 
     cout<<i; 
     ++i; 
    } 

} 

輸出爲-5,-4,-3,-2。 不應該直到-1輸出值嗎?爲什麼只有-2。 請解釋'不'和'否定'操作符之間的區別。當我編寫程序時,他們是錯誤的來源。NOT(〜)與NEGATION(!)

while(i) 

我知道循環條件將是真正的正面和負面的我的除了0

while(!i) vs while(~i) 

對於得到執行什麼樣的「i」的上述兩個循環值?

+0

如果你不記得'的區別!'和'〜','使用!'。這幾乎總是你想要的。 '〜'很少有必要。 – duskwuff 2012-07-20 02:55:50

+1

提示可能對您有用,因爲正確的答案已經發布。對於(模塊化)整數類型,「〜i == -i - 1」。 – 2012-07-20 02:56:31

+3

運算符實際上在C++中有名稱:'!'是'not','~'是'compl'。 (小寫,不是大寫) – MSalters 2012-07-20 08:57:51

回答

24

i當到達-1,的~i值爲~-1,或0,所以while循環停止執行。 !運營商的工作原理是因爲它完全不同;對於0值,結果爲1,對於所有其他值,結果爲0~是一個按位否定。

更詳細一點:

  • ~取入的數的每個位並切換它。因此,例如,10010 會變成01101
  • -1都是一二進制當補符號整數。
  • ~0b…111111110

但是:

  • !01!anythingElse0
  • -10
  • !-1仍然0

如果你真的想爲L包括i == -1,只需使用while (i)而不是while (~i)

5

你是正確的關於i == -1作爲退出條件:你的循環相當於

int i=-5; 
while(i != -1) 
{ 
    cout<<i; 
    ++i; 
} 
// i == -1 immediately after the loop 

當這樣寫的,應該很清楚爲什麼-1不打印值首先打印,然後纔是增加這就是爲什麼-2是您打印的最後一個值。

另一方面,!操作員只有在給定零時纔會生成1。這就是爲什麼當在循環條件中使用!運算符時,循環將打印-1

2

'〜'是運算符:〜x = -x-1 以及當i = -1時,則〜i = 0。 如果你想知道〜i的值,你可以將它們打印出來:

#include <iostream> 

using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int i=-5; 
    for (int i = -5; i <= 3; i++) 
    { 
    cout<<i<<" "<<(~i)<<endl; 
    } 
} 

,然後你會發現: -5 4 -4 3 -3 2 -2 1 -1 0 0 -1 1-2 2-3 3-4