人随世俗变 发表于 2020-12-12 16:00:10

运算符结合的优先关系

#include <stdio.h>

int main(){
        int a=1,b=1,c=-1;
        printf("%d,%d",a+=a<b-c,a+=a-=a*=4);       
        return 0;
}


格式化输出这里的 a+=a<b-c 和 a+=a-=a*=4有点理不清运算顺序,有没有朋友帮忙解答下

昨非 发表于 2020-12-12 16:07:55

这里有优先级的表格
对着表格不难看懂的
https://blog.csdn.net/u014100559/article/details/90764534?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160776041719724838575070%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160776041719724838575070&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-90764534.pc_search_result_cache&utm_term=c%E8%AF%AD%E8%A8%80%E4%BC%98%E5%85%88%E7%BA%A7&spm=1018.2118.3001.4449

人随世俗变 发表于 2020-12-12 16:14:38

昨非 发表于 2020-12-12 16:07
这里有优先级的表格
对着表格不难看懂的
https://blog.csdn.net/u014100559/article/details/90764534?op ...

能说说这题的运算过程?

昨非 发表于 2020-12-12 16:16:15

人随世俗变 发表于 2020-12-12 16:14
能说说这题的运算过程?

        printf("%d,%d",( a += (a < (b - c))),( a +=( a -= (a *= 4))));

人随世俗变 发表于 2020-12-12 16:27:55

昨非 发表于 2020-12-12 16:16


在计算( a += ( a < ( b - c ) ) ) ,是不是第一步 b-c = 2,第二步 a<2真为1第三步a+=1 结果为2

人随世俗变 发表于 2020-12-12 16:30:25

昨非 发表于 2020-12-12 16:16


如果单独运行 a+=a<b-c结果是等于2,但是这个表达式后面又有一个双目赋值的结合表达式,运行出来的结果就不一样了。所以我不太清楚,第一个表达式的a值会受到 第二个表达式的影响?

昨非 发表于 2020-12-12 16:35:57

人随世俗变 发表于 2020-12-12 16:30
如果单独运行 a+=a

会的,a的值也是变化的
#include <stdio.h>

int main() {
        int a = 1, b = 1, c = -1;
        printf("%d\n", a);
        printf("%d\n", (a += (a < (b - c))));//前一语句
        printf("%d\n", a);

        printf("%d\n", (a += (a -= (a *= 4))));//后一语句
        printf("%d\n", a);

        printf("%d,%d",( a += (a < (b - c))),( a +=( a -= (a *= 4))));
        return 0;
}
结果:
1
2
2
0
0
1,0

人随世俗变 发表于 2020-12-12 16:44:23

昨非 发表于 2020-12-12 16:35
会的,a的值也是变化的

结果:

两个表达式分开我清楚了,但是一旦放在一句我就有点混乱,不清楚怎么个计算得出1的

昨非 发表于 2020-12-12 16:48:46

人随世俗变 发表于 2020-12-12 16:44
两个表达式分开我清楚了,但是一旦放在一句我就有点混乱,不清楚怎么个计算得出1的

从右到左执行
执行后一语句时,得到a=0
在执行前一个的时候,
a=0,加一得1

人随世俗变 发表于 2020-12-12 16:59:26

昨非 发表于 2020-12-12 16:48
从右到左执行
执行后一语句时,得到a=0
在执行前一个的时候,


那么后一个最后的结果咋又成1了

昨非 发表于 2020-12-12 17:02:13

人随世俗变 发表于 2020-12-12 16:59
那么后一个最后的结果咋又成1了

不是说了吗,a<b-c得值为true,
a=0,
0+true = 1

人随世俗变 发表于 2020-12-12 17:15:01

昨非 发表于 2020-12-12 17:02
不是说了吗,a

我是想说 printf("%d,%d",( a += (a < (b - c))),( a +=( a -= (a *= 4)))); 中的( a +=( a -= (a *= 4))) 怎么结果又变成1了

昨非 发表于 2020-12-12 17:17:47

人随世俗变 发表于 2020-12-12 17:15
我是想说 printf("%d,%d",( a += (a < (b - c))),( a +=( a -= (a *= 4)))); 中的( a +=( a -= (a *= 4)) ...

第二个表达式结果是0啊

人随世俗变 发表于 2020-12-12 17:40:19

昨非 发表于 2020-12-12 17:17
第二个表达式结果是0啊

我这边运行出来结果是1,1
页: [1]
查看完整版本: 运算符结合的优先关系