C 和 C++ 中运算符大小的不同输出
Different outputs of sizeof operator in C and C++
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
。算子==
和!=
产生true
或false
,即类型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++ 的代码会产生不同的结果。请接受这是一个挑战。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何根据单词在文本中出现的概率输出单词