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 ++中的逗号运算符不计算第二个表达式的主要内容,如果未能解决你的问题,请参考以下文章