【问题标题】:Different outputs of sizeof operator in C and C++C 和 C++ 中 sizeof 运算符的不同输出
【发布时间】:2018-01-19 22:16:24
【问题描述】:

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

【问题讨论】:

  • sizeof(bool)sizeof(wchar_t) 是实现定义的
  • 为什么这个问题被否决了?
  • sizeof('a') 也不同。
  • @lilezek 我没有投反对票,但可能是因为这个问题确实不是特别有用。毕竟,C 和 C++ 是不同的语言,自 C++ 诞生以来,它们就有细微的差别和不那么细微的差别。期望任意代码表现相同只是表明忽略了这个简单的事实。
  • @lilezek mmm..可能缺乏研究? google resultsecnd hit??

标签: c++ c sizeof


【解决方案1】:

根据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

【讨论】:

【解决方案2】:

==!= 运算符的C 中,结果为int

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

4 表示sizeof(int),但这取决于架构。


==!= 运算符的C++ 中,结果为bool

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

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

【讨论】:

  • C 有一个内置类型 _Bool,但它是一个较晚的附加组件,并没有在任何可能(应该?)使用的地方使用。
  • 你说 C 没有内置的布尔类型,但它有。你应该改写你的答案。
  • "未在任何地方使用" --> 所有符合 C99、C11 的编译器都有_Bool
  • @chux 我将“未在任何地方使用”理解为“未完全集成到语言中”。 1==1 的结果是 C 中的 int,而对 _Bool 的更全面集成可能会修改它。虽然很难看到任何可衡量的好处。
  • @Persixty 一个有趣的想法,但是将1==1 修改为不是int 的东西会破坏很多代码库。这就是添加改进与带有动力的传统选择的效果 - 无论好坏。
【解决方案3】:

因为结果的类型在 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++ 的代码会产生不同的结果。请接受这个挑战。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2013-11-08
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多