我编译了这个看似不正确的代码,但我不明白为什么

时间:2018-11-13 02:38:35

标签: c++

我正在Linux机器上学习C ++。我只是尝试使用“ int i();”来声明一个函数,但是却忘记了对其进行定义。但是令我惊讶的是,该代码可以编译并输出1.我感到非常困惑。我尝试了“ int I {};”,它仍然编译没有错误。请帮忙解释。预先感谢。

 //test1.cpp
#include <iostream>
int main(void)
{
    int i{};
    std::cout << i << std::endl;
    return 0;
}

g++ test1.cpp
./a.out
Output is: 0

//test2.cpp
#include <iostream>
int main(void)
{
    int i();
    std::cout << i << std::endl;
    return 0;
}

g++ test2.cpp
./a.out
Output is : 1

2 个答案:

答案 0 :(得分:3)

在第一个示例中,您定义了一个名为Enemy[] enemies1 = { new Enemy( "Weak Skeleton:", 100, 0, 100 ), new Enemy( "Blue Slime:", 50, 0, 25 ), new Enemy( "Novice Rogue Mage:", 25, 100, 0 ) }; 的变量,并将其值初始化,对于i来说,它意味着零初始化。

int

在第二个示例中,您声明一个名为int i{}; // defines i, initialised to zero 的函数,该函数不带任何参数,然后返回i

int

打印时:

int i(); // declares a function

std::cout << i << std::endl; 首先被转换为i({{1}衰减为函数non-nullptr指针,然后变为bool),然后打印为整数,即为什么得到i。编译器可以在没有定义true的情况下进行此转换(结果始终为1),这就是为什么没有链接器错误的原因。

如果您打算调用此函数并打印结果,则需要使用i

true

这当然需要i()的定义。

答案 1 :(得分:1)

在您的代码中:

//test1.cpp
#include <iostream>
int main(void)
{
    int i{};
    std::cout << i << std::endl;
    return 0;
}

您实际上并没有定义函数就没有声明它。 int i{}; main()中的代码行functionvariable type中的int,名为i,您正在使用brace initializer list初始化变量i,不带任何值,在大多数情况下可以为0,但可以因compiler而异。

//test2.cpp
#include <iostream>
int main(void)
{
    int i();
    std::cout << i << std::endl;
    return 0;
}

在这种情况下,基本上是同一件事。您处于main()之内,并且受"you can not declare-define a function within a function"语言的限制,因此这将导致declaration - definition中的variable。唯一的区别是您没有使用brace initializer list ctor,这里使用的是值初始化。同样,您没有向其传递任何值,而是为您分配了任意值constructor

现在,如果您的代码如下所示:

1

由于#include <iostream> int i(); int main() { std::cout << i() << '\n'; return 0; } functioni而不是declared,因此无法编译。但是,如果您这样做:

defined

因为#include <iostream> // The text in quotes is not meant to be a string literal. It // is the message of the text that represents any integer X. int i() { return /*"some int value"*/ 1; } int main() { std::cout << i() << '\n'; return 0; } function既是i又是declared,所以可以编译并运行得很好。