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

Posted

技术标签:

【中文标题】c ++中的逗号运算符不计算第二个表达式【英文标题】:comma operator in c++ doesn't evaluate second expression 【发布时间】:2013-11-22 03:09:36 【问题描述】:

我写了以下代码:

#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

【问题讨论】:

How does the Comma Operator work 的可能重复项 【参考方案1】:

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

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++ 引入的,允许您将函数原型放在函数体中,这被称为most vexing parse。

【讨论】:

【参考方案2】:
int m = f(),v(); 

该语句执行f()并将返回值赋给m,然后声明返回int类型的函数v()int v(); 也称为most vexing parse。

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

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

见live sample。

【讨论】:

还要注意逗号分隔符的优先级低于赋值运算符。 另外,你可以试试 int m = (f(),v()); @billz:我误解了这个问题。 +1。 @billz 我希望我们能忘记这是最令人烦恼的解析。如果您查看链接到的文章,您会发现最令人烦恼的解析更复杂 T1 x(T2()); 而不是 T x(); 此声明中存在的歧义与“最令人烦恼的解析”根本没有关系。

以上是关于c ++中的逗号运算符不计算第二个表达式的主要内容,如果未能解决你的问题,请参考以下文章

C ++ 11中的常量表达式中是不是允许逗号运算符?

C语言中逗号表达式的实用意义或者产生的原因?

在C语言中赋值运算符有啥作用?

C语言中表达式是怎么计算的?

c中的逗号运算符[重复]

js中的逗号运算符