在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;
}

毫无疑问,它们都给出了输出: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++中返回不同的值?


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


正如Paul所说,这是因为'a'在C中是int型,而在c++中是char型。

我在几年前写的文章中提到了C和c++之间的具体区别,地址是:http://david.tribble.com/text/cdiffs.htm


在C语言中,字符字面量的类型是int和c++中的char。这在c++中是支持函数重载所必需的。请看这个例子:

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

输出:

char

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

因此,sizeof character literal等于C中的sizeof integer。

在c++语言中,字符字面值是char类型。cppreference是这样的:

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

在c++中,character literal是一种char类型。因此,c++中字符字面量的大小是一个字节。

另外,在你的程序中,你对sizeof运算符使用了错误的格式说明符。

C11§7.21.6.1 (p9):

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

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