C和C ++中sizeof()
运算符的不同输出。
在C:
int main()
{
printf("%zu\n", sizeof(1 == 1));
return 0;
}
输出:
4
在C ++中:
int main()
{
std::cout << sizeof(1 == 1) << std::endl;
return 0;
}
输出:
1
问题:
sizeof
是否独立于操作系统或编译器?答案 0 :(得分:18)
6.5.9平等运营商
==
(等于)和!=
(不等于)运算符类似于关系运算符,除了它们的优先级较低。如果指定的关系为真,则每个运算符产生1
,如果为假,则产生0
。 结果的类型为int
。
因此,sizeof(1 == 1)
将返回与实现定义的sizeof(int)
相等的值,在您的情况下为4
。
5.10平等运营商
==
(等于)和!=
(不等于)运算符组从左到右。操作数应具有算术,枚举,指针或指向成员类型的指针,或者键入std::nullptr_t
。运营商==
和!=
都会产生true
或false
,即类型的结果bool
。
因此,sizeof(1 == 1)
将返回与实现定义的sizeof(bool)
相等的值,在您的情况下为1
。
答案 1 :(得分:15)
C
和==
运营商的!=
结果为int
根据N1570草案 - 6.5.9平等运营商
4
表示sizeof(int)
,但这取决于架构。
C++
和==
运营商的!=
结果为bool
根据N4296草案 - 5.10平等运营商
1
表示sizeof(bool)
大小不能小于一个字节。但是大于一个字节是合法的。
答案 2 :(得分:7)
因为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 ++程序,它演示了使用模板specializaton(典型输出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 ++代码。请接受这是一个挑战。