未知转义序列的使用是否会调用 C++ 中的未定义行为?

Is the use of unknown escape sequence invokes undefined behavior in C++?

考虑以下程序:

#include <iostream>
int main()
{
     std::cout<<"Can this lead to undefined behavior?"<<'\s';
}

g++给出警告:

[Warning] unknown escape sequence: '\s' [enabled by default]

这里 '\s' 是不小心输入的,而不是 '\n'。那么,这个程序是明确定义的还是未定义的? C++ 标准对此有何评论? K&R 的 C 编程语言说它是 C 中的未定义行为。

(N3337 [lex.ccon]/3):Escape sequences in which the character following the backslash is not listed in Table 7 are conditionally-supported, with implementation-defined semantics.

这意味着如果您的实现支持非标准转义序列,则它们是有效的。检查您的特定实现的文档以了解任何其他字符的语义。

不,根据标准 '\s' 是不允许的。在 'es 之间,你必须有一个 c-characters 序列,它们可以是 escape-sequences、universal-character-names 或单引号以外的字符 ('),反斜杠 (\) 或换行符。

你的编译器接受它(如果它记录了它,根据标准允许它这样做)是另一个问题,你应该查阅你的编译器文档以获取有关它如何解释它的信息(或停止编写不符合规范的内容)代码)。