这段代码怎么不报错呢?

int backgroundASCIICode = ' ';

该代码摘自 YouTube 上一个名为 ASMR spin cube 的视频。

这绝对是第一次。从来没有想过我会看到一个 int 类型的空字符串

8

  • math.h请不要发送垃圾邮件标签,这与和无关cmath


    – 

  • 5
    从来没有想过我会看到一个空字符串——你在右侧看到的=不是一个空字符串。


    – 

  • 1
    它不是一个字符串,它是一个简单的空格字符。由于单个字符都具有整数值,因此该行代码没有(技术上)错误。空格的值为0x20, 或32十进制。


    – 

  • 那不是一个空字符串。那是一个空格字符。


    – 

  • 4
    除非询问两种语言之间的差异或交互,否则不要同时标记 C 和 C++。选择一个标签并删除另一个。


    – 


3 个回答
3

从来没有想过我会看到一个 int 类型的空字符串

这是因为它不是字符串。

  • C:' '正是一个 int,因此将其分配给 anint从来都不是问题。
  • C++:' '正是一个 char,因此将其分配给 anint 可能会触发有关隐式符号转换的警告(如果char是无符号的),然后在 case sizeof(char)==时也会缩小范围sizeof(int)。这是您很少遇到的情况。

4

  • 如果sizeof(char)等于sizeof(int),会如何EOF工作?


    – 

  • @AykhanHagverdili 我会去检查流的状态,而不检查读取的字符是否等于EOF


    – 

  • 我的评论主要是关于标准合规性。由于 EOF 需要一个不等于任何有效值的值因此系统是否sizeof(char) == sizeof(int)符合标准。intchar


    – 


  • @AykhanHagverdili 是的,两个标准都允许sizeof(char)等于sizeof(int)。然而, Anint不允许小于 16 位(在任何标准中)。我认为最常见的情况是它们都是 32 位(CHAR_BIT那么就是 32 位)。需要统计检查。


    – 


' '不是空字符串。它是两个撇号之间的空格。这是一个字符常量。其值是空格字符的字符代码。在C中,它有int类型。在C++中,它有char类型。

从变量名中,我们可以推测是 ASCII,在这种情况下,空格字符的代码是 32。

单引号不是字符串,它们是字符文字。而且它不是空的,而是一个空间。

C/C++ 将char类型视为整数类型,因此您可以将 a 隐式转换charint. C 甚至int立即赋予字符文字类型。

其结果很可能是十六进制 0x20 或十进制 32——空格字符的 ASCII 代码。

因此:
" "-> 长度为 1 的字符串文字,包含空格字符,类型为const char[]
' '-> 表示空格字符的字符文字,类型为char(C++) 或int(C)。

另外:
"abc"-> 长度为 3 的字符串文字
'abc'-> 错误

6

  • 2
    'abc' -> an error这不是一个具有“实现定义”值的吗?尽管话虽如此,但这几乎总是不是您想要的。


    – 


  • 2
    'abc'不是一个错误。这是一个多字符文字。


    – 

  • 1
    "abc"是长度为4的字符串文字,而不是 3 。类似地,是长度为2" "的字符串文字。不要忘记终止符“\0”。


    – 


  • 1
    @PeteBecker"abc"的长度为 3,大小为 4(长度加上 ‘\0’)。


    – 

  • @JohnBayko:如果你们两个要迂腐的话,C 标准没有定义字符串文字的长度。字符串的长度是“空字符之前的字节数”(C 2018 7.1.1 1),但字符串和字符串文字是不同的东西。该字符串确实包含空字符(也是 7.1.1 1),即使其长度定义为不包含它。但字符串文字是源代码构造,其源代码字节长度与程序执行无关。字符串文字会导致创建一个包含空字符的数组 (6.4.5 6)…


    –