C(因此也包括C ++)支持转义某些特殊字符或字符序列,例如\b
,\t
,\n
,\"
,\\
等。当不需要转义时会发生什么?据我记得,在几个编译器中,转义字符\
被静默跳过。在cppreference.com上,我阅读了这些文章
我只在C文章中找到了有关孤儿反斜杠的注释
如果反斜杠后跟此处未列出的任何字符,则ISO C要求进行诊断:[...]
参考表上方。除了询问年迈的日常编译器外,我还看了一些在线编译器
#include <stdio.h>
int main(void) {
// your code goes here
printf("%d", !strcmp("\\ x", "\\ x"));
printf("%d", !strcmp("\\ x", "\\\ x"));
printf("%d", !strcmp("\\ x", "\\\\ x"));
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << (string("\\ x") == "\\ x");
cout << (string("\\ x") == "\\\ x");
cout << (string("\\ x") == "\\\\ x");
return 0;
}
["\\ x"
和"\\\ x"
都等同,通过语法高亮显示(某种)警告。
我可以假定这是定义的行为吗?
您需要使用兼容的C编译器进行编译。各种在线编译器都倾向于使用默认设置为“宽松非标准模式”(又名GNU C)的gcc。这可能会或可能不会启用某些非标准转义序列,但也不会产生编译器错误] >即使您违反了C语言-您也可能会收到“警告”,但这并不能使代码成为有效的C。
如果您告诉gcc使用-std=c17 -pedantic-errors
作为符合标准的C编译器,则会出现此错误:
error: unknown escape sequence: '\040'
040是32的八进制,这是
' '
的ASCII码。 (由于某些原因,gcc在内部将八进制符号用于转义序列,这可能是因为\ 0是八进制的,我不知道为什么。)
C标准说这是错误的: