嗨,大家好,我是C++新手(和SO),想知道为什么当我打印这个函数时总是会输出为1。好的这里的代码:打印功能时,为什么总是输出为1?
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它总是打印出一个。为什么?我期待它输出0,因为整数默认为0.那么为什么是1?
嗨,大家好,我是C++新手(和SO),想知道为什么当我打印这个函数时总是会输出为1。好的这里的代码:打印功能时,为什么总是输出为1?
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它总是打印出一个。为什么?我期待它输出0,因为整数默认为0.那么为什么是1?
int x(int());
是“most vexing parse”的情况;您认为这是一个int
(int x
)的声明,初始化为整数(int()
)的默认值;相反,编译器把它解释为一个函数返回一个int
这需要作为一个参数(指针)函数不带任何参数,并返回一个声明的int
(你可能会很麻烦声明由this site解释,或获得的一些更多的了解C型声明here)。
然后,当你这样做:
cout << x;
x
这里衰减到函数指针,但没有的operator<<
重载需要一个函数指针;给出的operator<<
一些有效的过载是bool
,并且,由于一个函数指针不能有0(NULL
)值的最简单的隐式转换,它被评价为true
,其被印刷为1
注意,I” m不能完全确定这样的代码应该没有错误地被编译 - 你正在接受一个函数的地址,这个函数只是被声明而没有被定义;它是真的,它不能进行评估,以比true
其他任何东西,但原则上的线,你应该得到一个链接错误(由优化这里掩盖,这消除了x
任何引用,因为它没有实际使用)。
你其实想的是:
int x=int();
函数正在转换为bool
并正在打印为bool
值。该函数位于非零地址,因此转换生成true
。
这是一个标准转换序列,由一个函数到指针的转换,后跟一个布尔转换组成。
接下来的顺序是因为没有更好的重载operator<<
。
为什么会发生? 'int()'返回0(刚刚测试过),无论如何将会被抛弃到'false'。 – slugonamission
@slugonamission:'int x(int());'声明'x'作为一个函数(返回'int'并且带一个'int(*)()'参数)。在这种情况下,'x'不是int,并且'int()'不是临时的int。 – Mankarse
我需要重新阅读语言规范。干杯:) – slugonamission
你知道,'x'不是'int',对不对?你似乎,但它不完全清楚你的问题...... –
@ K-ballo我知道这一点。这是一个功能吗? –
那你为什么期望它打印'0'? int的_value initialization_和那个有什么关系? –