无用的反斜杠在C / C ++中表现良好吗?

问题描述 投票:2回答:2

C(因此也包括C ++)支持转义某些特殊字符或字符序列,例如\b\t\n\"\\等。当不需要转义时会发生什么?据我记得,在几个编译器中,转义字符\被静默跳过。在cppreference.com上,我阅读了这些文章

我只在C文章中找到了有关孤儿反斜杠的注释

如果反斜杠后跟此处未列出的任何字符,则ISO C要求进行诊断:[...]

参考表上方。除了询问年迈的日常编译器外,我还看了一些在线编译器

C demo

#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;
}

C++ demo

#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++ c escaping string-literals
2个回答
1
投票

您需要使用兼容的C编译器进行编译。各种在线编译器都倾向于使用默认设置为“宽松非标准模式”(又名GNU C)的gcc。这可能会或可能不会启用某些非标准转义序列,但也不会产生编译器错误] >即使您违反了C语言-您也可能会收到“警告”,但这并不能使代码成为有效的C。

如果您告诉gcc使用-std=c17 -pedantic-errors作为符合标准的C编译器,则会出现此错误:

error: unknown escape sequence: '\040'

040是32的八进制,这是' '的ASCII码。 (由于某些原因,gcc在内部将八进制符号用于转义序列,这可能是因为\ 0是八进制的,我不知道为什么。)


0
投票

C标准说这是错误的:

© www.soinside.com 2019 - 2024. All rights reserved.