2014-10-04 7 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 –

ответ

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           ;. 

Некоторые из непечатаемых на второй линии имеют U+2009 'THIN SPACE' разновидности (e2 80 89 в UTF-8).

Компилятор не любит эти пробелы и делает свое недовольство известным (с тем, что, по моему мнению, является достаточно ясным сообщением об ошибке).

+0

Как я могу понять, что с первого взгляда и почему это произошло ???? –

+0

@ Daniel.V: 'xxd' - удобный инструмент для ситуаций, подобных этому. – NPE

+0

В любом случае сообщение об ошибке делает это очевидным. Он в обоих случаях жалуется на байты, которых не должно быть. – Deduplicator

0

Choise кодировка, например, в Notepad ++ как UTF-8 без BOM, я думаю, что это будет хорошо

Смежные вопросы