【问题标题】:Escape sequence in C in string字符串中的C中的转义序列
【发布时间】:2021-05-12 01:57:34
【问题描述】:

在这段代码中:

int main() 
{ 
   char str[]= "geeks\nforgeeks"; 
   char *ptr1, *ptr2; 
       
   ptr1 = &str[3]; 
   ptr2 = str + 5; 
   printf("%c", ++*str - --*ptr1 + *ptr2 + 2);  
   printf("%s", str);  
   
   getchar(); 
   return 0; 
} 

为什么编译器将 \n 解释为转义序列而不是两个字符,即 \ 和 n?

另一方面,这个程序并没有注释掉你好。

int main() 
{ 
   char str[]= "geeks/*hello*/geeks";
   printf ("%s",str);
   return 0;
}

【问题讨论】:

  • 因为\n 被定义为转义序列?
  • 但那是在字符串里面,编译器怎么知道?
  • 作为反论点
  • @programmer \ 与 / 不同。 \ 被特殊对待。
  • 在字符串文字中 / 只是一个普通字符,但 \ 是一个转义字符,因此可以写入不可打印的字符,例如换行符、制表符、回车符等。请参阅下面的答案。

标签: c escaping comments string-literals


【解决方案1】:

但是那是在字符串里面,那么编译器怎么知道呢?

下面的引号和链接足以理解什么是转义序列。

来自Wikipedia

在 C 中,所有转义序列都由两个或多个字符组成,第一个是反斜杠 \(称为“转义字符”);

同样来自C11 Standard

在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠 \ 后跟一个或多个字符组成的转义序列表示。一个所有位都设置为 0 的字节,称为空字符,应存在于基本执行字符集中;它用于终止一个字符串。

【讨论】:

    【解决方案2】:

    为什么编译器将 \n 解释为转义序列而不是 两个字符,即\和n?

    根据转义序列的定义。

    C 标准(5.2.2 字符显示语义)

    2 表示非图形字符的字母转义序列 执行字符集旨在在显示上产生动作 设备如下:

    //... \n (new line) 将活动位置移动到初始位置 下一行。

    如果你想有两个单独的字符 \n 那么你应该写例如

    char str[]= "geeks\\nforgeeks"; 
    

    现在有两个单独的字符,其中一个由转义序列 '\\' 表示,另一个由符号 'n' 表示。

    至于你的第二个问题

    另一方面,这个程序并没有注释掉你好。

    char str[]= "geeks/*hello*/geeks";
    

    然后在字符串文字符号 /* 和 */ 不形成注释。它们是字符串文字的元素。

    C 标准(6.4.9 评论)

    1 在字符常量、字符串文字或 评论,字符 /* 引入评论。这样一个内容 仅检查注释以识别多字节字符并查找 终止它的字符 */。

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 2022-01-26
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多