我是C的初学者,对此感到困惑。
C:
我尝试使用“%zu”修饰符在C中打印sizeof('a'),然后输出值4.
C++:
使用cout在C ++中打印sizeof('a'),printf(使用上面的格式)都打印了值1.
我认为正确的值应为1,因为'a'将被视为char。为什么不在C中返回4?这两种语言的操作规模是否都不同?如果是这样,有什么区别,为什么它会返回不同的值? 我在两种情况下都使用了gcc编译器。
答案 0 :(得分:11)
在C中,'a'
是一个字符常量,它被视为一个整数,所以得到的大小为4,而在C ++中它被视为char
。这与此处的问题重复:
答案 1 :(得分:4)
在C中,字符文字(常量)的类型为int。 所以,请考虑以下程序
#include <stdio.h>
main(int argc, char *argv[])
{
printf("%zu\n", sizeof('a'));
printf("%zu\n", sizeof('ab'));
printf("%zu\n", sizeof('abc'));
printf("%zu\n", sizeof('abcd'));
printf("%u\n", 'a');
printf("%u\n", 'ab');
printf("%u\n", 'abc');
printf("%u\n", 'abcd');
printf("%x\n", 'a');
printf("%x\n", 'ab');
printf("%x\n", 'abc');
printf("%x\n", 'abcd');
printf("%c\n", 'a');
printf("%c\n", 'ab');
printf("%c\n", 'abc');
printf("%c\n", 'abcd');
}
前四个语句都将文字视为一个字符常量,并且它们都打印4 == sizef(int),至少在gcc(Ubuntu 4.4.3-4ubuntu5.1)4.4上。 3。 请注意,此编译器会为上述程序打印几个警告:
warning: multi-character character constant
基本上,字符文字指定组成int的四个字节, 从左到右,先是高位字节。 丢失的前导字节用0填充。 因此,在我的机器上打印第二和第三组printf语句
97
24930
6382179
1633837924
61
6162
616263
61626364
在十六进制输出中,您可以看到四个字符的布局 literal(从左到右的ASCII码):'a'映射到 最高位字节0x61)。
最后,第四组打印:
a
b
c
d
即。字符文字作为整数被压在堆栈上,但是printf 仅将该int的最低字节打印为char。
C ++的行为方式类似,但考虑使用单字节字符文字 类型为char,而不是int。该计划
#include <iostream>
using namespace std;
main(int argc, char *argv[])
{
cout << sizeof('a') << endl;
cout << sizeof('ab') << endl;
cout << sizeof('abc') << endl;
cout << sizeof('abcd') << endl;
cout << 'a' << endl;
cout << 'ab' << endl;
cout << 'abc' << endl;
cout << 'abcd' << endl;
}
将使用GCC进行编译并发出类似的警告。它的输出是不同的 从C:
1
4
4
4
a
24930
6382179
1633837924
因此,单字节字符文字被视为char,而多字节文字则被视为字符 被视为int。
重要提示
我在32位Linux系统上运行测试,其中int有4个字节。这将是 有趣的是看看在其他系统上发生了什么,例如在64位系统上。
修改强>
修正了答案(感谢提示):字符文字在C中的类型为int,它们 不会被转换为int。