C / C ++中字符('a')的大小


298

C和C ++中字符的大小是多少?据我所知,在C和C ++中char的大小均为1个字节。

在C中:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

在C ++中:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

毫不奇怪,它们都给出了输出: Size of char : 1

现在我们知道,作为字符表示'a''b''c''|',...所以我只是修改了上面的代码对这些:

在C中:

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}

输出:

Size of char : 1
Size of char : 4

在C ++中:

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

输出:

Size of char : 1
Size of char : 1

为什么sizeof('a')在C和C ++中返回不同的值?


8
"%|"格式需要的int参数(或东西提升到int)。 sizeof产生类型为的结果size_t。转换为int使用强制转换,或者,如果您的实现支持,则使用"%zu"
基思·汤普森

Answers:


348

在C语言中,像这样的字符常量的类型'a'实际上是一个int,其大小为4(或其他一些与实现相关的值)。在C ++中,类型为char,大小为1。这是两种语言之间的许多小差异之一。


12
在C ++ Standard中,至少在C 6.4.4.4中为2.13.2 / 1部分,至少在我所拥有的文档中。

14
+1(但“ 4的大小”显然适用于nthrgeek的平台,但不一定适用于所有平台。)
sbi 2010年

28
@nthrgeek:我懒得同时引用这两个标准,但是C ++标准有一个专用于与C不兼容的附录。在附录C.1.1中,它提到“字符文字的类型从更改intchar,从而解释了行为。 :)
杰夫

3
@nthrgeek:第6.4.4.4节第10段:“整数字符常量的类型为int。包含单个字符并映射到单字节执行字符的整数字符常量的值是所映射表示的数值。字符解释为整数。”
斯蒂芬·佳能

7
@nthrgeek:除非有关于特定观点的论点,并且您想了解为什么其他人有不同的意见,否则您不应要求提供标准参考。如果每个人都同意,那就接受它。您(作为开发人员)应该足够聪明,可以自己迅速找到诸如此类的常见答案。
马丁·约克

26

正如Paul所说,这是因为在C语言中'a'intC,但是char在C ++中。

我在几年前写的文章中介绍了C和C ++之间的特定区别:http//david.tribble.com/text/cdiffs.htm


4
很好奇,但是您是否正在努力更新(非常详细的)文档以包括C ++ 11和C11中的新更改?
亚当·罗森菲尔德

现在不行。在过去的五年左右的时间里,我对C和C ++的兴趣下降了很多。
David R Tribble

3
嗯,我用你的工作写了这篇,这里就这么说了。这么小的世界!

17

在C中,字符文字的类型在C ++中为intchar。这是C ++中支持函数重载所必需的。请参阅以下示例:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

输出:

char

5

在C语言中,字符文字不是char类型。C将字符文字视为整数。因此,sizeof('a')和之间没有区别sizeof(1)

因此,字符文字的sizeof等于C中的sizeof整数。

在C ++语言中,字符文字是的类型char。该cppreference说的:

1)窄字符字面或普通字符文字,例如'a''\n''\13'。这种文字的类型char和值等于执行字符集中c-char的表示形式。如果c-char在执行字符集中不能表示为单个字节,则文字具有int类型和实现定义的值。

因此,在C ++中,字符文字是的一种char。因此,C ++中字符文字的大小为1个字节。

Alos,在您的程序中,您为sizeof操作员使用了错误的格式说明符。

C11§7.21.6.1(P9):

如果转换规范无效,则行为是不确定的。275)如果任何参数不是对应转换规范的正确类型,则行为是不确定的。

因此,您应该使用%zu格式说明符而不是%d,否则它是C中的未定义行为。


%zu在许多平台上不受支持,但是更好的可移植性,使用(int)sizeof(char)和格式%d
chqrlie

字符文字的值不一定是相应的ASCII码。它取决于源和执行字符集以及char默认情况下类型是带符号的还是无符号的。
chqrlie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.