这段代码怎么不报错呢?
int backgroundASCIICode = ' ';
该代码摘自 YouTube 上一个名为 ASMR spin cube 的视频。
这绝对是第一次。从来没有想过我会看到一个 int 类型的空字符串
8
3 个回答
3
从来没有想过我会看到一个 int 类型的空字符串
这是因为它不是字符串。
- C:
' '
正是一个int
,因此将其分配给 anint
从来都不是问题。 - C++:
' '
正是一个char
,因此将其分配给 anint
可能会触发有关隐式符号转换的警告(如果char
是无符号的),然后在 casesizeof(char)
==时也会缩小范围sizeof(int)
。这是您很少遇到的情况。
4
-
如果
sizeof(char)
等于sizeof(int)
,会如何EOF
工作?
– -
@AykhanHagverdili 我会去检查流的状态,而不检查读取的字符是否等于
EOF
。
– -
我的评论主要是关于标准合规性。由于 EOF 需要一个不等于任何有效值的值,因此系统是否
sizeof(char) == sizeof(int)
符合标准。int
char
–
-
@AykhanHagverdili 是的,两个标准都允许
sizeof(char)
等于sizeof(int)
。然而, Anint
不允许小于 16 位(在任何标准中)。我认为最常见的情况是它们都是 32 位(CHAR_BIT
那么就是 32 位)。需要统计检查。
–
|
' '
不是空字符串。它是两个撇号之间的空格。这是一个字符常量。其值是空格字符的字符代码。在C中,它有int
类型。在C++中,它有char
类型。
从变量名中,我们可以推测是 ASCII,在这种情况下,空格字符的代码是 32。
|
单引号不是字符串,它们是字符文字。而且它不是空的,而是一个空间。
C/C++ 将char
类型视为整数类型,因此您可以将 a 隐式转换char
为int
. 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)…
–
|
math.h
请不要发送垃圾邮件标签,这与和无关cmath
。–
=
不是一个空字符串。–
0x20
, 或32
十进制。–
–
–
|