为什么字符串中的//不能在C++中启动注释?

Nis*_*ary 7 c++ string string-literals

我正在打印这样一条线

cout<<"Hello //stackoverflow";
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出

Hello //stackoverflow
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它没有给我一个错误,因为我评论了一半的陈述,应该有

missing terminating " character
Run Code Online (Sandbox Code Playgroud)

错误.

eer*_*ika 11

C++的语法(与大多数编程语言一样)是上下文敏感的.简单地说,//如果它在字符串文字中,则不会开始评论.


Bat*_*eba 8

要对此进行深入分析,您必须参考语言语法,特别是字符串文字生成规则.

非正式地说,//引用的字符串文字中出现的事实意味着它不表示注释块.这同样适用于/**/.

反过来适用于其他构造,其中最大munch需要解析为表示注释块开始的标记; 指针取消引用操作符之前需要一个空格

#include <iostream>
using namespace std;

int main() {
    int n = 1;
    int* p = &n;
    cout << 1 / *p; // Removing the final space will fail compilation.
}
Run Code Online (Sandbox Code Playgroud)

  • 附录,从C++ 11开始,允许`unique_ptr <vector <int >>`,而不需要在最后两个`>>之间留一个空格.这违反了最大的蒙克政策,否则就是常态.我认为津贴通常被认为是一个好主意,但我确信有一支队伍对这一变化不满意. (2认同)