15

我写了以下代码:

#include <iostream>
using namespace std;

int f()
{
    cout << "f()" << endl;
    return 3;
}

int v()
{
    cout << "v()" << endl;
    return 4;
}

int main()
{
    int m = f(),v();
    cout << m << endl;
    return 0;
}

我希望它打印出来:

f()
v()
3

编译g++ -O0 test.cpp -o test.out并运行结果:

f()
3

为什么省略了对 v 的调用?(这不能用于优化,因为我添加了标志-O0

4

2 回答 2

21
int m = f(),v(); 

该语句执行 f() 并将返回值赋给 m,然后声明v()返回 int 类型的函数。int v();也被称为最令人头疼的解析

要完成您的comma operator测试,请尝试:

int m;
m = f(),v();
cout << m << endl;

现场样品

于 2013-11-10T07:34:15.587 回答
4

您的代码的以下变体演示了这是做什么的:

http://ideone.com/GBae0p

#include <iostream>

int f() { std::cout << "f()" << std::endl; return 1; }

int main() {
   int t = f(), v();
   std::cout << t << std::endl;
   return 0;
}

即使我们没有“v()”,也可以正确编译。

逗号运算符正在拆分此行

   int t = f(), v();

进入

   int t = f();
   int v();

第二行是一个函数原型,它声明将有一个函数 ,int v()它不接受任何参数并返回一个 int。

它不调用它,它只是预先声明它——以防编译器在实际定义之前遇到对它的调用——因为主体是一个空语句(;)。编译器假设我们将在稍后或在不同的编译单元中实现它。

因为这通常会混淆经验和新程序员,因为它是由 C++ 引入的,允许您将函数原型放入函数体中,这被称为最令人头疼的解析

于 2013-11-10T08:07:02.580 回答