我做了一些实验,但我无法解释为什么它会这样工作。
示例 1:
#include <stdio.h>
int main() {
/// латиница
printf("\n%d",sizeof('a')); /// 1
/// кириллица
printf("\n%d",sizeof('ф')); /// 4
return 0;
}
示例 2:
#include <stdio.h>
int main() {
char a = 'a'; /// латиница
char b = 'ф'; /// кириллица
printf("\n%d",sizeof(a)); /// 1
printf("\n%d",sizeof(b)); /// 1
return 0;
}
实在是不明白,求解释!PS 编译器 g++
sizeof
- 形式上不是函数,而是在编译时给出类型大小的运算符 - 即 存储这种类型的变量需要多少内存。'a'
从您获得拉丁文字值 1的事实来看,您不是按 C 编译,而是按 C++ 编译!在纯 C 中,字符文字被强制转换为int
,您将得到 4。例如,您还必须假设您的源文件保存为 utf-8,以便将西里尔字母扩展为大于 的
char
内容,并将该内容转换为int
并给出 4。最后几行接收的不是文字,而是类型的变量
char
,对于 C++ 来说,它是唯一的 -sizeof(char) == 1
。就这样...
PS 因为有些人坚持...... :) 从字符文字标准:
程序代码中的字符(和字符串)文字以某种方式被编译器翻译成字节序列。这种转换的规则取决于源的编码(正如其他贡献者已经提到的),但也可能取决于许多其他因素(参见另一个问题的答案)。
应该注意的是,当您尝试使用clang编译器进行编译时,您的代码的两个版本 都会导致错误:
您正在使用的 gcc对带有字母的行给出了几个警告
ф
:第一个是关于使用多字符文字(并非所有编译器都支持)。第二个是这个文字不适合
char
. 那些。该类型'ф'
已被编译器解释为大于char
,正如@Harry 的回答中已经提到的,这种类型是int
:基于以上,我们可以得出结论:
4
(例 1)得到,因为 多字符文字未被截断且其大小等于int
,即sizeof(int) == 4
.1
(例2) 得到,因为 多字符文字char
在变量初始化时被截断为类型b
,但sizeof(char) == 1
根据定义。我会在这里回复你对另一篇文章的评论:
'ф'
你真的不能写超过 2 。那些。事实上,该值被截断为
sizeof(int)
.但是如果使用字符串文字,那么两个字节
ф
可能就足够存储了:输出一个数字
3
因为 分配 1 个字节用于终止零。单字节字符文字的类型
'q'
是char
,sizeof(char)
等于 1。多字节字符文字的类型
'qq'
是int
,sizeof(int)
例如 4。如果源文件以 utf-8 编码保存,则字面
'ф'
量为两个字节,相当于'\xd1\x84'
. 因此,它的类型是int
.