2015-02-24 47 views
2

讓我們以下面的程序(稱爲charco.cpp//有意開始):C++與XOR值比較奇怪的行爲

// 
#include <iostream> 
#include <stdio.h> 
int main() 
{ 
    FILE* fp = fopen("charco.cpp", "rt"); 
    char c = fgetc(fp); 
    if(c == '/') 
    { 
     char c2 = fgetc(fp); 
     if(c2 == 122^85) // *** OK 
     { 
      c2 = fgetc(fp); 
      while(c2 != 246^252) // **** NOT OK 
      { 
       c2 = fgetc(fp); 
      } 
     } 
    } 
} 

在目前的化身,它會永遠循環下去,與**** NOT OK指示的路線,因爲它將無法行尾字符匹配//,所以它讀取整個文件後...

但是,如果我改變246^25210(char)(246^252)或者只是'\n'它沒有環路再一次,它匹配正確,但(char)246^252再次失敗。

任何人都可以解釋爲什麼這種奇怪的行爲? (編譯:​​G ++ 4.9.2)

+0

除了了iostream包括,這是C. – Borgleader 2015-02-24 14:41:03

+1

這是爲什麼C++問題標記[標籤:C]? – 2015-02-24 14:41:06

+0

爲什麼這個C問題被稱爲C++? – 2015-02-24 14:41:34

回答

16
while (c2 != 246^252) 

你正在做的:

while ((c2 != 246)^252) // Fail, bool^252 

如果C2 = 246,這將使253(0^252)。否則會給予252

你必須用括號:-)

while (c2 != (246^252)) // Correct, c2 != 10 
+0

僅供參考(OP)請參閱[此運算符優先級表](http://en.cppreference.com/w/cpp/language/operator_precedence)。 – 2015-02-24 14:48:34

+0

[這是一個嘗試](http://stackoverflow.com/questions/17369090/operator-precedence-table)我曾經做過一個C11優先表。 – Lundin 2015-02-24 14:54:33

+0

是...這也解釋了爲什麼'(c2 == 122^85)'雖然它提供了一個非常奇怪的值,但是正確執行... – fritzone 2015-02-24 14:54:45

5

For historical reasons,位運算符有一個奇怪的operator precedence

你必須用括號來強制進行正確的順序:

while (c2 != (246^252)) 

事實上,我強烈建議,當你使用這些運算符使用括號所有的時間。

這裏的一個小例子,以示區別:

cout << (1 == 1^2) << " " << (1 == (1^2)); 
// 3 0 
+0

我想看看那些歷史原因:) – fritzone 2015-02-24 14:55:20

+1

我只是想找到一篇好文章..基本上最初的位運算符被用於邏輯運算符和實際的邏輯運算符後來被添加到語言中,但到那時他們不想修復優先級 - 太多的代碼依賴於優先順序。 – 2015-02-24 14:57:21

+0

找到了一個... :) – 2015-02-24 14:59:43