为啥以下代码中逗号运算符的工作方式有所不同?

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 这就是我在回答中所解释的。你不明白哪一部分?你知道逗号运算符是做什么的吗?

以上是关于为啥以下代码中逗号运算符的工作方式有所不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥逗号运算符在运算符[]内部称为逗号运算符而不在运算符()内部调用?

为啥 return 0 或 break 不能与逗号运算符一起使用?

c语言这个逗号表达式的结果是啥,为啥?

为啥编译器不能通过逗号运算符扩展可变参数模板的参数?

为啥 dbTimeStamp() 添加逗号?

C ++中逗号运算符的不同行为与返回?