为啥以下代码中逗号运算符的工作方式有所不同?
Posted
技术标签:
【中文标题】为啥以下代码中逗号运算符的工作方式有所不同?【英文标题】:Why is there a variation in the working of the comma operator in the below codes?为什么以下代码中逗号运算符的工作方式有所不同? 【发布时间】:2015-02-24 08:31:17 【问题描述】:考虑以下代码 sn-ps 案例1:
int main()
int a;
a=printf("hello"),printf("joke");
printf("%d",a);
return 0;
案例2:
int main()
int a;
a=(printf("hello"),printf("joke"));
printf("%d",a);
return 0;
案例3:
int main()
int a;
a=10>8?(printf("hello"),printf("joke")):printf("hello");
printf("%d",a);
return 0;
案例4:
int main()
int a;
a=10>8?printf("hello"),printf("joke"):printf("hello");
printf("%d",a);
return 0;
我无法找出原因,当我在案例 2 中使用 paranthesis 时,我得到的输出为 hellojoke4,而没有使用 parantheis,我得到的输出为 hellojoke5。
根据输出,当我尝试使用三元运算符时,然后使用括号或不使用括号执行相同的表达式,返回 printf 语句的最后一个输出值,即 hellojoke4 ,那么行为在三元运算符的情况。 括号的存在如何影响逗号的工作,它的作用是像分隔符还是像运算符
【问题讨论】:
想想吧。在这种情况下,括号可以做什么?int a=(1,2);
,
的优先级较低,因此 a=2
【参考方案1】:
这完全取决于逗号运算符的低优先级。没有括号,表达式被分组为
(a=printf("hello")), printf("joke");
所以,从第一个 printf 到 a
的赋值,然后是第二个 printf
。在第二个示例中,将第二个printf
的结果分配给a
。
为了简化:
a = 1, 2; // (a = 1), 2; post-condition a==1
a = (1, 2); // a = (1, 2); is equivalent to a = 2; post-condition a==2
【讨论】:
这就是我无法理解的事实,为什么通过使用括号结果会发生变化,实际上编译器是如何解析这个东西并返回最后一个操作数的值。 @RADHAGOGIA 这就是我在回答中所解释的。你不明白哪一部分?你知道逗号运算符是做什么的吗?以上是关于为啥以下代码中逗号运算符的工作方式有所不同?的主要内容,如果未能解决你的问题,请参考以下文章
为啥逗号运算符在运算符[]内部称为逗号运算符而不在运算符()内部调用?