C++ 中的逗号运算符不计算第二个表达式



我写了以下代码:

#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

int m = f(),v(); 

此语句执行 f() 并将返回值分配给 m,然后声明返回 int 类型的函数v()int v();也称为最令人烦恼的解析。

要实现comma operator测试,请尝试:

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

查看实时样本。

以下代码变体演示了此操作:

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++引入的,允许您将函数原型放在函数体中,这被称为最烦人的解析。

相关内容

  • 没有找到相关文章

最新更新