我遇到了这段代码:
if (1, true) {/*...*/}
它究竟意味着什么? 虽然评估结果为真:
void foo(){}
...
if(1, foo()) {/*...*/}
这不会编译:
void foo(){}
...
if (1 == foo()) {/*...*/}
显然是因为编译器期望foo()返回一些整数值。我以为逗号会转换为某个运算符。 if子句中的逗号是否转换为内部内容?
答案 0 :(得分:11)
逗号运算符只是计算其左操作数,然后是右操作数。所以像
这样的表达式(1, true)
首先评估1
,然后评估true
,结果表达式值为true
。
在这种特殊情况下,使用逗号运算符似乎毫无意义。
答案 1 :(得分:7)
逗号运算符返回右操作数的结果,并丢弃左操作数的结果。 两个操作数都被评估,先左,然后右。
答案 2 :(得分:1)
这是逗号运算符。它计算1,然后计算true
,然后检查true
是否为真,它是,所以它执行if。
答案 3 :(得分:1)
正如其他人所解释的那样,这是逗号(或顺序评估)运算符。
但是,第二个代码段也不起作用,请参阅gcc 4.3.4's output。逗号运算符以从左到右的顺序执行其所有操作数,将每个操作数作为单个子表达式处理,并返回链中最后一个表达式的值。当foo()
返回void
时,表达式不正确。如果编译器接受它,则违反了语言标准。
答案 4 :(得分:0)
Comma operator。从左到右进行评估。结果是最右边表达的结果。