有参数与无参数的编译器在做什么?

时间:2018-11-14 01:50:10

标签: c++ initialization

关于C ++编译器,我有一个不重要的问题。以下代码输出

1
2
3

,我不知道为什么。用空参数声明它完全没有括号有什么区别?

#include <iostream>
using namespace std;

int main()
{
    int x;
    cout << x << endl;

    int y();
    cout << y << endl;

    int z(2);
    cout << z << endl;

    return 0;
}

编译器是g ++。

1 个答案:

答案 0 :(得分:4)

第一个xdefault initialized,其值不确定,然后cout << x导致undefined behavior,意味着一切皆有可能。

  

具有自动和动态存储持续时间的非类变量的默认初始化会产生具有不确定值的对象

第二个int y();声明了一个名为y的函数,该函数没有参数,并返回int。对于cout << yy将衰减为函数指针,该函数指针可以隐式转换为bool,然后您将得到1(即true。您可以使用std::boolalphastd::cout << std::boolalpha << y一样获得输出true)。

第三个zdirect initialized,其值为2,那么cout << z会得到2

LIVE sample with clang,请注意编译器给出的所有警告消息。