C语言自加自减问题,计算出的值与系统给出的结果不符

img

img


已经计算出来p的值,但是q的值却无法匹配系统给出来的值22,自己计算出的值是21。
想问这种情况是因为没有给pq初始化所造成的,还是因为计算失误造成的?

这种题跟编译器有关的,意义不大

三个++j相加的时候 先运算了前面两个自增 (j自增了两次-> 7) 再将两个j加起来(14) 最后运算第三个自增(8) 然后加第三个j(22)

这个不同的编译器答案是不一样的,有的先++3次,每个J都等于7了然后相加就是等于21,有的前面两个++,前面两个J=7,然后加后面一个8,就等于22.
这是C语言里有名的一个BUG,按道理是不允许这样赋值的。

一般的运算规则如下:
()里面的表达式先算,++在变量前面则将变量加1然后取变量值
++在变量后面则先取变量的值然后也要将变量加1
所以:
p=(i++)+(i++)+(i++)=5+6+7=18
q=(++j)+(++j)+(++j)=6+7+8=21
i,j分别进行了三次++操作,故其值为原来的值5加3
=8
但是这里面还与具体的编译器有关,你给出的答案可能是因为编译器的运算规则如下
p=(i++)+(i++)+(i++)中的i++运算同时进行,此时i=5
p=5+5+5=14
q=(++j)+(++j)+(++j)=6+8+8=22
代码尝试:

#include<stdio.h>

int main(){
    int i = 5, j = 5, p ,q;
    p = (i++) + (i++) + (i++);
    q = (++j) + (++j) + (++j);
    printf("%d %d %d %d",p,q,i,j);
    return 0;
}

运行结果:

img


虽然成功运行,但是报错了:
警告:对i的操作可能是未定义的

img

这跟编译器有关,题主明白自增的原则就可以了,这种题不建议深究。
希望对题主有所帮助,望采纳!!

C语言标准里没有规定运算符操作数的计算顺序,所以不同编译器对操作数的计算顺序就可能不一样。另一个是函数参数的计算顺序C语言标准也没有规定。

From https://en.cppreference.com/w/c/language/eval_order

  1. If a side effect on a scalar object is unsequenced relative to another side effect on the same scalar object, the behavior is undefined.
i = ++i + i++; // undefined behavior
i = i++ + 1; // undefined behavior
f(++i, ++i); // undefined behavior
f(i = -1, i = -1); // undefined behavior
  1. If a side effect on a scalar object is unsequenced relative to a value computation using the value of the same scalar object, the behavior is undefined.
f(i, i++); // undefined behavior
a[i] = i++; // undefined bevahior

你如果会汇编,问题就简单了

你这个编译的代码是问题代码,计算机知道运算优先级,但是没法根据这个进行运算,不同处理器上结果可能不一样,例如(++j)+(++j)+(++j),电脑只知道先执行括号里的,但是电脑是从右向左运行,运行第一个加号时要将两侧的括号里面的计算好,但是运行第一个括号内容时,会改变j值,电脑无法做出正确选择,如果电脑是先计算括号里的,在进行相加,是一个结果,先进行前两个括号里的,再加,再求第三个括号里面的,再加,这又是一种,不同的系统处理方式不一样,结果也不一样,这是有问题的,需要改正一下

这些运算都符合规定,先运行括号里的

编译器不同,得出的结果不同,一般以vc++为主

没必要纠结 和编译器有关

涉及自加自减的题目由于编译器的问题,很多编译器的结果可能都不一样,即出现不同的答案,所以这个不用太在意

++是自增运算符,变量调用自增运算符之后,值会+1

--是自减运算符,变量在调用自减运算符之后,值会-1