2014-10-04 77 views
1

我有這樣一個簡單的C++代碼:C++展示奇怪的行爲

#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    int n , a , b ; 
    cin >> n >> a >> b ; 
    //This two lines are exactly same!!!! 
    cout << n - max(a + 1, n - b) + 1 << endl ; 
    //cout << n - max(a + 1, n - b) + 1 << endl ; 
} 

在這段代碼中,我有兩個線是完全一樣的,但是當我編譯確切上面的代碼,我得到我的結果與任何輸入例如(5,2,3),但是當我取消對第二cout和評論的第一個與所有以前的狀態代碼不編譯(GNU 4.8.2),並得到這個錯誤:

sample.cpp:8:5: error: stray ‘\342’ in program 
    cout << n - max(a + 1, n - b) + 1 << endl ; 
    ^
sample.cpp:8:5: error: stray ‘\200’ in program 
sample.cpp:8:5: error: stray ‘\211’ in program 
sample.cpp:8:5: error: stray ‘\342’ in program 
sample.cpp:8:5: error: stray ‘\200’ in program 
sample.cpp:8:5: error: stray ‘\211’ in program 
sample.cpp:8:5: error: stray ‘\342’ in program 
sample.cpp:8:5: error: stray ‘\200’ in program 
sample.cpp:8:5: error: stray ‘\211’ in program 
sample.cpp:8:5: error: stray ‘\342’ in program 
sample.cpp:8:5: error: stray ‘\200’ in program 

我嘗試與Microsoft Visual C++ 2010編譯器,我得到了相同的結果,但不同的錯誤:

program.cpp 
program.cpp(9) : error C2065: 'n¢?%' : undeclared identifier 
program.cpp(9) : error C2065: 'a¢?%' : undeclared identifier 
program.cpp(9) : error C2065: '¢?%1' : undeclared identifier 
program.cpp(9) : error C2065: '¢?%n¢?%' : undeclared identifier 
program.cpp(9) : error C2065: '¢?%b' : undeclared identifier 
program.cpp(9) : error C2146: syntax error : missing ';' before identifier '¢?%' 
program.cpp(9) : error C3861: '¢?%max': identifier not found 
program.cpp(9) : error C2065: '¢?%' : undeclared identifier 
program.cpp(9) : error C2065: '¢?%1' : undeclared identifier 

我無法理解這兩個cout是完全一樣的,但第一個正常工作和第二個不爲什麼這是一個編譯器錯誤?

+0

考慮使用不會插入怪異字符不同的文本編輯器。我衷心建議VIM – 2014-10-04 12:13:07

回答

8

這兩條線是不一樣的 - 第二多字節字符UTF-8在它:

$ cat line1 | xxd -g 1 
0000000: 20 20 20 20 63 6f 75 74 20 3c 3c 20 6e 20 2d 20  cout << n - 
0000010: 6d 61 78 28 61 20 2b 20 31 2c 20 6e 20 2d 20 62 max(a + 1, n - b 
0000020: 29 20 2b 20 31 20 3c 3c 20 65 6e 64 6c 20 3b 20 ) + 1 << endl ; 
0000030: 0a            . 

$ cat line2 | xxd -g 1 
0000000: 20 20 20 20 63 6f 75 74 20 3c 3c 20 6e e2 80 89  cout << n... 
0000010: 2d e2 80 89 6d 61 78 28 61 e2 80 89 2b e2 80 89 -...max(a...+... 
0000020: 31 2c e2 80 89 6e e2 80 89 2d e2 80 89 62 29 e2 1,...n...-...b). 
0000030: 80 89 2b e2 80 89 31 20 3c 3c 20 65 6e 64 6c 20 ..+...1 << endl 
0000040: 3b 0a           ;. 

一些在第二行上的空格的(以UTF-8 e2 80 89)是的U+2009 'THIN SPACE'品種。

編譯器不喜歡這些空格,並使其不愉快的已知(我認爲是一個相當明確的錯誤信息)。

+0

我怎麼能明白,第一次看,爲什麼發生這種情況? – 2014-10-04 11:36:22

+0

@ Daniel.V:'xxd'是適用於這種情況的便捷工具。 – NPE 2014-10-04 11:37:58

+0

無論如何,這個錯誤信息顯而易見。它在兩種情況下都抱怨應該不在那裏的字節。 – Deduplicator 2014-10-04 11:39:06

0

的choise編碼例如在記事本++像UTF-8無BOM,我認爲這將是確定