在C中解释反斜杠

时间:2013-10-21 12:02:43

标签: c escaping backslash slash

任何人都可以解释下面的代码,并请解释反斜杠(\)在这种情况下的作用。 \'\"\ooo\ \\?是什么意思?

#include <stdio.h>
int main(){
    char a = '\010';
    char y = '010';
    printf("%d,%d",a,y);

    return 0;
}
输出:8,48

5 个答案:

答案 0 :(得分:5)

这个'\010'是八进制的八进制转义序列 10,十进制为8,在调用时会被提升为int printf以便解释这个价值。

这个'010'多字符常量,如果我们查看C99草案标准部分6.4.4.4 字符常量,它的值是实现定义的段 10 说(强调我的):

  

[...]包含多个字符的整数字符常量的值(例如,   'ab'),或包含不映射到单字节的字符或转义序列   执行字符,是实现定义的。[...]

如果你使用gcc,你至少会看到这个警告:

  

警告:多字符字符常量[-Wmultichar]

并且可能在溢出时发出此警告:

  

警告:隐式常量转换溢出[-Woverflow]

y获得的值更有趣,因为字符常量有一个整数值,它不能只取第一个字符,多字符常量< / em>必须采用整数值,然后转换为 char clang有助于提供更详细的警告:

  

警告:从'int'隐式转换为'char'会将值从3158320更改为48 [-Wordstant-conversion]

当前版本的gcc生成相同的值,正如我们从这段简单的代码中看到的那样:

printf("%d\n",'010');

那么3158320来自哪里?至少对于gcc,如果我们查看Implementation-defined behavior的文档,则说:

  

编译器一次评估一个字符的多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到宽度的新字符的位模式中一个目标角色。最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同)。如果常量中的字符数多于目标int中的符号,则编译器会发出警告,并忽略多余的前导字符。

如果我们执行上述操作(假设8位字符)文档,我们会看到:

 48*2^16 + 49*2^8 + 48  = 3158320
 ^         ^
 |         decimal value of ASCII '1'
 decimal value of ASCII '0'
无论gcc签名还是

int都会使用模数char2^8转换为char无符号,它有效地为我们留下了最后8位或48

答案 1 :(得分:5)

在第一种情况下,\010被解释为八进制,导致8

在第二种情况下,返回0010中的第一个字符)的ascii值,即48

如果您有编译器警告,可能是您已经计算出第二个

char y = '010';

自己。 (在这种情况下,gcc会发出-Wmultichar-Woverflow。)


引用C1X draft,第6.4.4.4部分:

  

整数字符常量的类型为 int 。整数的值   包含映射到a的单个字符的字符常量   单字节执行字符是数值   解释为整数的映射字符的表示形式。该   包含多个的整数字符常量的值   字符(例如, 'ab' ),或包含字符或转义序列   不映射到单字节执行字符,是   实现定义即可。如果整数字符常量包含a   单个字符或转义序列,其值是产生的值   当类型为 char 的对象的值为单个对象时   字符或转义序列转换为 int 类型。

答案 2 :(得分:5)

转义序列用于删除某些保留字符(如')的含义或指定某些特殊字符(如换行符'\n')或在此情况下为具有特定ASCII值的字符:

char a = '\010';

定义八进制ASCII值为10 8 的字符,即十进制值8 10

char y = '010';

定义多字节字符,该字符应分配给宽字符,而不是char。虽然没有定义此赋值的行为,但在这种情况下,它很可能会导致最后一个字符存储在y

答案 3 :(得分:4)

希望这会有所帮助:

\a  Beep
\b  Backspace
\f  Formfeed
\n  New line
\r  Carriage return
\t  Horizontal tab
\v  Vertical tab
\\  Backslash
\'  Single quotation mark
\"  Double quotation mark
\0  ASCII 0x00 (nul terminator)
\ooo    Octal representation
\xdd    Hexadecimal representation
\xnn    Hexadecimal character code nn
\onn    Octal character code nn
\nn     Octal character code nn

转义序列是包含反斜杠(\)后跟某个字符的字符组合。当您使用几乎所有语言进行编程时,有时您需要参考不会产生特定字符的按键。

例如假设您开发的语言假定变量用方括号[var]括起来 - 那么如果您输入的值不是变量,那么您将必须像\[10\]那样将其转义。否则,您的编译器会认为10是变量名。

答案 4 :(得分:3)

这是一个转义序列 - 请参阅http://en.wikipedia.org/wiki/Escape_sequences_in_C