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

346

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

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


9
"%|"格式要求传入一个int类型的参数,或者是能够被提升为int类型的其他类型。sizeof操作返回的结果是size_t类型。你可以使用强制类型转换将其转换为int类型,或者如果你的实现支持的话,使用"%zu"格式。 - Keith Thompson
4个回答

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

13
在我手头的文档中,C++标准第2.13.2/1节,C语言6.4.4.4节有相关内容。 - anon
17
除此之外,虽然“4的大小”显然适用于nthrgeek的平台,但并不一定适用于所有平台。 - sbi
38
@nthrgeek:我懒得引用两个标准,但C++标准有一个附录专门讲述与C不兼容的地方。在附录C.1.1下,它提到“字符字面值的类型从'int'改为'char'”,这就解释了这种行为。 :) - jalf
4
整数字符常量具有int类型。包含单个映射到单字节执行字符的字符的整数字符常量的值是将映射字符的表示解释为整数的数值。 - Stephen Canon
7
@nthrgeek:除非你在争论某个具体的观点并且想要理解为什么对方有不同的看法,否则你不应该要求一个标准参考。如果每个人都同意,那就接受它。作为开发者,你应该足够聪明,能够自己快速找到像这样的共同答案。 - Martin York
显示剩余6条评论

33

正如Paul所说,这是因为在C中'a'是一个int,但在C++中则是一个char

我曾在几年前写过一篇关于C和C++之间特定差异的文章,您可以在此链接查看:http://david.tribble.com/text/cdiffs.htm


4
有点好奇,你是否在更新那份(非常详细的)文档,以包含C++11和C11中的新变化? - Adam Rosenfield
目前还没有。我对C和C++的兴趣在过去的五年里已经大大减弱了。 - David R Tribble

23

在 C 语言中,字符字面量的类型是 int,而在 C++ 中是 char。这是为了支持函数重载而必须的。看以下例子:

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

输出:

char

1
其他回答中没有提到的有趣细节。谢谢。 - 0xC0000022L
最好的解释,应该被接受为答案。 - Sekomer

8
在C语言中,字符字面值不是char类型。C将字符字面值视为整数。因此,sizeof('a')和sizeof(1)没有任何区别。在C中,字符字面值的大小等于整数的大小。
在C++语言中,字符字面值是char类型。cppreference网站指出:
1)窄字符字面值或普通字符字面值,例如'a'、'\n'或'\13'。这样的字面值具有char类型,并且其值等于执行字符集中的c-char表示。如果c-char在执行字符集中不能表示为单个字节,则该字面值具有int类型和实现定义的值。
因此,在C++中,字符字面值是char类型。因此,字符字面值的大小在C++中为1个字节。
此外,您的程序使用了错误的sizeof运算符格式说明符。
C11 §7.21.6.1(P9):
如果转换说明符无效,则行为是未定义的。如果任何参数不是相应转换说明符的正确类型,则行为是未定义的。
因此,在C中,您应该使用%zu格式说明符而不是%d,否则它是未定义的行为。

%zu is not supported on many platforms, but better portability, use (int)sizeof(char) and format %d - chqrlie
字符字面值的值不一定是相应的ASCII码。它取决于源和执行字符集以及char类型默认是否为有符号或无符号。 - chqrlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接