注册 登录
编程论坛 C++教室

逗号与运算符优先级问题

Dxoad 发布于 2020-04-16 18:50, 1995 次点击
程序代码:
#include<iostream>
int main() {
    int a =10,b,c,t =0,s =100;
    a += 20;
    c = b *= b = a;    //b不是等于零的吗 ,还有运算顺序是什么
    std::cout << a <<" "<< b <<" "<< c <<" "<< t;
}



程序代码:
#include<cstdio>
int main() {
    int a =5;
    printf("%d %d %d",a,a++,a++);
}

这个为什么返回值是 7 6 5 而不是5 5 5



int j = 10,k = 1000;
int i = (k+2,j+100,999+j);
为什么会取到最后一个,这里面的括号有什么作用,不加括号为什么会报错而加了就没问题
逗号起到什么作用



[此贴子已经被作者于2020-4-16 19:05编辑过]

4 回复
#2
rjsp2020-04-16 20:09
c = b *= b = a;    //b不是等于零的吗 ,还有运算顺序是什么
哪里有b等于零的代码?我看了一遍又一遍,没找到。
“还有运算顺序是什么” --- 顺序是 (c = (b *= (b = a)))

printf("%d %d %d",a,a++,a++);
这个为什么返回值是 7 6 5 而不是5 5 5
C++17 前为未定义行为,C++17 起为未指明

int i = (k+2,j+100,999+j);
为什么会取到最后一个,这里面的括号有什么作用,不加括号为什么会报错而加了就没问题
i 被赋予 (k+2,j+100,999+j) 这个表达式的值,k+2,j+100,999+j 这个表达式的值是 最后一个子表达式的值。
“不加括号为什么会报错” --- 那你觉得 int i=k+2, j+100, 999+j; 是什么含义,定义一个int变量名字叫 j+100 吗?

#3
Dxoad2020-04-16 22:04
回复 2楼 rjsp
没认真看,,,解决了

[此贴子已经被作者于2020-4-16 22:28编辑过]

#4
Dxoad2020-04-16 22:22
回复 2楼 rjsp
等一下,dalao请留步,还有一个疑惑
(k+2,j+100,999+j);
k+2和j+100是不是可以忽略,直接看最后一个子表达式
k+2和j+100是不是没有参与运算,如果参与了那他们计算得出的值参加赋值操作了吗(如果中间出现错误数据了,他还会返回最后一个子表达式的值吗)


做题一直很迷,前面的表达式(指k+2和j+100)不知道是否进行处理并参加运算(比如出现x--,--x),是否可以直接忽略看最后一个,还是分情况处理

[此贴子已经被作者于2020-4-16 22:31编辑过]

#5
rjsp2020-04-16 22:39
是不是可以忽略(优化)掉,要看它有没有副作用。

对于逗号表达式 (a, b) 先执行(评估)子表达式a,再执行(评估)子表达式b,而 整个表达式(a, b) 的评估值是子表达式b的评估值。
1