C 和 C++ 中运算符大小的不同输出

Different outputs of sizeof operator in C and C++

本文关键字:输出 C++ 运算符      更新时间:2023-10-16

sizeof()运算符在 C 和 C++ 中的不同输出。

在 C 语言中:

int main() 
{
printf("%zun", sizeof(1 == 1));
return 0;
}

输出:

4

在C++:

int main() 
{
std::cout << sizeof(1 == 1) << std::endl;
return 0;
}

输出:

1

问题:

  • 为什么输出不同?
  • sizeof独立于操作系统或编译器吗?
  • 它依赖于语言吗?

根据 N1570 草案 (c11(:

6.5.9 相等运算符

==(等于(和!=(不等于(运算符类似于关系运算符,只是它们的优先级较低。如果指定的关系为真,则每个运算符都产生1,如果为假,则0结果具有类型int.

因此,sizeof(1 == 1)将返回相等的值给sizeof(int)这是定义的实现,在您的情况下它是4


根据 N4296 草案 (c++14(:

5.10 相等运算符

==(等于(和!=(不等于(运算符从左到右分组。操作数应具有算术、枚举、指针或指向成员类型的指针,或类型std::nullptr_t。算子==!=产生truefalse,即类型bool的结果。

因此,sizeof(1 == 1)将返回相等的值给sizeof(bool)这是实现定义的,在您的情况下它是1

>C==!=运算符的结果是int

根据 N1570 草案 -6.5.9 相等运算符

4意味着sizeof(int),但这取决于建筑。


C++==!=运算符的结果是bool

根据 N4296 草案 -5.10 相等运算符

1表示大小不能小于一个字节sizeof(bool)。但大于一个字节是合法的。

因为 C 中的结果类型是int(4 字节是典型大小(,而在 C++ 中它是bool(1 是典型大小(。

这些值取决于实现。

下面是一个 C11 程序,演示了使用_Generic(典型输出int 4(:

#include <stdio.h>
void what_int(){
printf("int %lu",sizeof(int));
}
void what_other(){
printf("other ?");
}
#define what(x) _Generic((x), 
int : what_int(),
default: what_other()
)
int main(void) {
what(1==1);
return 0;
}

这是一个C++程序,演示了使用模板专用化(典型的输出bool 1(:

#include <iostream>
template<typename T>
void what(T x){
std::cout<<"other "<<sizeof(T);
}
template<>
void what(bool x){
std::cout<<"bool "<<sizeof(bool);
}

int main(){
what(1==1);
return 0;
}

我无法轻易想到任何既是 C 又是 C++ 的代码会产生不同的结果。请接受这是一个挑战。