为什么打印功能时总是将输出设为1?

时间:2012-12-29 01:20:40

标签: c++

大家好我是C ++(和SO)的新手,并想知道为什么我打印此功能时总是将输出设为1。好的,这是代码:

#include <iostream>
using namespace std;

int main() {
    int x(int());
    cout << x; // 1
}

它总是打印一个。为什么?我期待它输出0,因为整数被默认为0.那么为什么1?

2 个答案:

答案 0 :(得分:2)

int x(int());

是“most vexing parse”的情况;你认为这是一个intint x)的声明,初始化为int的默认值(int());相反,编译器将其解释为返回int的函数的声明,该函数将参数a(指向)函数作为参数,该函数不接受任何参数并返回int(您可以获得由毛茸茸的声明解释this site,或者更多地了解C类型声明here)。

然后,当你这样做时:

cout << x;

x这里衰减到函数指针,但是operator<<没有带有函数指针的重载;给operator<<的一些有效重载的最简单的隐式转换是bool,并且,由于函数指针不能具有0(NULL)值,因此它被计算为{{1} },打印为1。

请注意,我并不完全确定应该编译这样的代码而不会出错 - 您将获取仅声明且未定义的函数的地址; 是真的,它不能被评估为true以外的任何东西,但是原则上你应该得到一个链接器错误(这里被优化器屏蔽掉了,它删除了对{{{{{ 1}},因为它实际上没有使用过。)


你真正想要的是:

true

答案 1 :(得分:1)

该功能正在转换为bool,并打印为bool值。该函数位于非零地址,因此转换生成true

这是一个标准的转换序列,包括一个函数到指针的转换,然后是一个布尔转换。

遵循序列,因为没有更好的重载operator<<