【问题标题】:C++ showing strange behaviourC++ 表现出奇怪的行为
【发布时间】:2014-10-04 11:31:45
【问题描述】:

我有一个像这样的简单 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 完全相同,但第一个工作正常,第二个不正常,为什么这是编译器错误??

【问题讨论】:

  • 考虑使用不会插入奇怪字符的其他文本编辑器。我衷心推荐 vim

标签: c++ gcc compiler-errors


【解决方案1】:

这两行不一样 - 第二行包含多字节 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' 变体(UTF-8 中的e2 80 89)。

编译器不喜欢这些空格,并表达了它的不满(我认为这是一个相当清晰的错误消息)。

【讨论】:

  • @Daniel.V:xxd 是处理此类情况的便捷工具。
  • 无论如何,错误信息很明显。在这两种情况下,它都会抱怨不应该存在的字节。
【解决方案2】:

例如在 Notepad++ 中选择编码,例如没有 BOM 的 UTF-8,我认为可以

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多