int a = 1, b = 0; if(a, b) printf("success\n"); else printf("fail\n"); if(b, a) printf("success\n"); else printf("fail");
这是一个cpp文件,我在Visual Studio 2010中得到的输出为
fail success
为什么会这样?你能解释一下吗?
eanckbw91#
http://en.wikipedia.org/wiki/Comma_operator:在C和C++编程语言中,逗号运算符(由标记,表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。在您的第一个if中:
,
if
if (a, b)
a首先被求值并被丢弃,b其次被求值并返回0。所以这个条件是假的。在第二个if中:
a
b
if (b, a)
b首先被求值并被丢弃,a其次被求值并返回1。所以这个条件成立。如果有两个以上的操作数,则返回最后一个表达式。如果你希望这两个条件都为真,你应该使用&& operator:
if (a && b)
jdgnovmf2#
这里有一个例子,由维基百科提供,它展示了另一个用例:逗号可以在条件(if,while,do while或for)中使用,以允许辅助计算,特别是调用函数并使用结果,具有块作用域:如果(y = f(x),y > x){.//包含x和y的语句}// See this Wikipedia discussion许多C程序员都在for语句的初始化器部分遇到过逗号,但在if语句中看到它的人并不多。在上面的例子中,它允许你在if语句测试条件y>x之前初始化y。
ujv3wf0j3#
更好的解释是下面的代码解释:
if (a,b) { c(); }
含义:如果,执行操作a,评估条件B,如果条件B为真,则执行函数c
3条答案
按热度按时间eanckbw91#
http://en.wikipedia.org/wiki/Comma_operator:
在C和C++编程语言中,逗号运算符(由标记
,
表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。在您的第一个
if
中:a
首先被求值并被丢弃,b
其次被求值并返回0。所以这个条件是假的。在第二个
if
中:b
首先被求值并被丢弃,a
其次被求值并返回1。所以这个条件成立。如果有两个以上的操作数,则返回最后一个表达式。
如果你希望这两个条件都为真,你应该使用&& operator:
jdgnovmf2#
这里有一个例子,由维基百科提供,它展示了另一个用例:
逗号可以在条件(if,while,do while或for)中使用,以允许辅助计算,特别是调用函数并使用结果,具有块作用域:
如果(y = f(x),y > x){.//包含x和y的语句}
// See this Wikipedia discussion
许多C程序员都在for语句的初始化器部分遇到过逗号,但在if语句中看到它的人并不多。在上面的例子中,它允许你在if语句测试条件y>x之前初始化y。
ujv3wf0j3#
更好的解释是下面的代码解释:
含义:如果,执行操作a,评估条件B,如果条件B为真,则执行函数c