鲁七七 发表于 2021-8-28 21:35:02

自增自减运算符问题

#include<stdio.h>
void main()
{
        int i=5,j=5,p,q;
        p=(i++)+(i++)+(i++);
        q=(++j)+(++j)+(++j);
        printf("%d,%d,%d,%d\n",p,q,i,j);
}
为什么运算出来是15,22,8,8啊真的想不出为什么会有22?
麻烦了,大佬们。

人造人 发表于 2021-8-29 00:09:18

这类代码标准没有定义计算结果,不同的编译器很有可能会给出不一样的结果
讨论这样的代码是怎么算的 是没有意义的,这样的代码想怎么算就怎么算,就算是这样的代码输出的全部都是 0,也是完全可以的
如果要我来设计编译器,我就给这样的代码输出 0,这是完全没有问题的

因为确实不知道这样的代码应该先取值还是先 ++
所以,有的编译器先 ++,有的编译器先取值
这样的代码怎么算都可以,不算也可以,怎么都行

人造人 发表于 2021-8-29 00:12:11

在你看来,这样的代码应该先取值还是先 ++ ?
在我看来,直接输出 0,^_^

人造人 发表于 2021-8-29 02:08:30

int j = 5;
++j;    // 6
++j;    // 7
int a = j + j;// a = 7 + 7
++j;    // 8
int q = a + j;// q = 14 + 8
                //   = 22

鲁七七 发表于 2021-8-29 09:34:17

也就是说不同的编译器运算方式不同,只要能推出答案是怎么运算就可以了,没有固定的算法,对吗?

人造人 发表于 2021-8-29 09:39:59

鲁七七 发表于 2021-8-29 09:34
也就是说不同的编译器运算方式不同,只要能推出答案是怎么运算就可以了,没有固定的算法,对吗?

1. 你在你发的帖子下面回复别人,别人是收不到提示的,要点 ‘回复’ 按钮
2. 没有固定的算法
3. "只要能推出答案是怎么运算就可以了",推不出来的,你根本就不知道算法,怎么推?
这类问题直接跳过就可以了,或者直接记住答案不唯一就可以了,连推都不需要去推

鲁七七 发表于 2021-8-29 09:45:18

人造人 发表于 2021-8-29 09:39
1. 你在你发的帖子下面回复别人,别人是收不到提示的,要点 ‘回复’ 按钮
2. 没有固定的算法
3. "只要 ...

谢谢大佬,懂了{:10_275:}

人造人 发表于 2021-8-29 09:50:26

鲁七七 发表于 2021-8-29 09:52:29

人造人 发表于 2021-8-29 09:50


{:10_275:}

鲁七七 发表于 2021-8-29 21:52:54

人造人 发表于 2021-8-29 09:50


那个,大佬问你个问题
if (!strcmp(fa.name, ".") ll !strcmp(fa.name, ".."))
if (!strcmp(fa.name, ".") || !strcmp(fa.name, ".."))
这两个的区别哪里会导致计算错误啊{:10_272:}

人造人 发表于 2021-8-29 21:57:10

鲁七七 发表于 2021-8-29 21:52
那个,大佬问你个问题
if (!strcmp(fa.name, ".") ll !strcmp(fa.name, ".."))
if (!strcmp(fa.name, " ...

有两个字符不一样

鲁七七 发表于 2021-8-29 23:11:53

人造人 发表于 2021-8-29 21:57
有两个字符不一样

那两个竖杠到底是什么啊
大写I也不是小写L也不是

鲁七七 发表于 2021-8-29 23:13:47

人造人 发表于 2021-8-29 21:57
有两个字符不一样

大佬晚安,明天再解决吧,谢谢啦

人造人 发表于 2021-8-29 23:42:59

鲁七七 发表于 2021-8-29 23:11
那两个竖杠到底是什么啊
大写I也不是小写L也不是

鲁七七 发表于 2021-8-30 09:24:05

人造人 发表于 2021-8-29 23:42


谢谢,解决了

MZZ666 发表于 2021-9-26 12:46:38

还真和编译器有关啊
页: [1]
查看完整版本: 自增自减运算符问题