代码之家  ›  专栏  ›  技术社区  ›  Wolf

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

  •  2
  • Wolf  · 技术社区  · 4 年前

    \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" “\\\x” “\\x” .

    澄清(编辑)

    • 我是 不问 关于明显无效的字符串文本,如 "\" .
    • 孤立的反斜杠有点问题。
    • 定义 .

    编辑2:更加关注生成的常量(和可移植性)。

    0 回复  |  直到 4 年前
        1
  •  4
  •   Jean-Baptiste Yunès    4 年前

    答案是否定的。这是一个无效的C程序 C++一。

    表示语法错误(强调是我的),它不产生有效的标记,因此程序无效:

    5.2.1字符集

    2个/ 在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠\后跟一个或多个字符组成的转义序列表示。

    3个/ 单引号,双引号,问号?,反斜杠\和任意整数值可根据以下转义序列表表示:

    • 单引号' \'
    • 双引号“ \"
    • \?
    • \\
    • 八进制字符 \octal digits
    • \xhexadecimal digits

    八/ 由反斜杠\后跟小写字母:\ a、\ b、\ f、\ n、\ r、\ t和\ v组成。注意: .

    5.13.3文字

    7个/ 有条件地支持转义序列,其中反斜杠后面的字符未在表8中列出,其语义由实现定义

    因此,对于C++,需要查看编译器的语义手册,但是程序在语法上是有效的。

        2
  •  3
  •   Lundin    4 年前

    错误 即使你违反了C语言,你可能会得到一个“警告”,但这并不能使代码有效。

    如果你告诉gcc作为一个一致的C编译器 -std=c17 -pedantic-errors ,则会出现以下错误:

    error: unknown escape sequence: '\040'

    ' '