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

时间:2017-08-11 11:46:47

标签: c++ c sizeof

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是否独立于操作系统或编译器?
  • 是否依赖语言?

3 个答案:

答案 0 :(得分:18)

根据N1570草稿():

6.5.9平等运营商

  

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

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

根据N4296草稿():

5.10平等运营商

  

==(等于)和!=(不等于)运算符组从左到右。操作数应具有算术,枚举,指针或指向成员类型的指针,或者键入std::nullptr_t。运营商==!=都会产生truefalse,即类型的结果 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 ++代码。请接受这是一个挑战。