c语言的自减运算

发布时间:2024-05-13 05:51 发布:上海旅游网

问题描述:

#include <stdio.h>
main()
{
int a=2,b=2,x,y,z;
x=--a+2;
y=b--+2;
z=-a---b;
printf("x=%d y=%d z=%d\n",x,y,z);
printf("a=%d b=%d\n",a,b);
}
最后显示的Z值不应当是-4吗?为什么是-2呢?

问题解答:

程序是这样执行的:(声明部分和打印部分不做解释了,其余伪码解释)
{
x=--a+2; //a自减1变为1,x被赋值为3

y=b--+2; //cpu执行取数b为2(自减后变为1,但不取1运算)
//y被赋值为4

z=-a---b; //cpu执行取数a为1(自减后变为0,同样不取0做运算)
//cpu执行取数b为1(自减之后b被取),相加z为-2

//a自减已变为0,b自减变为1
}

注意:运算符优先级和'--i'和'i--'的执行过程 //QQ:499830474(算法交流)

x=a-1+2=2-1+2=3;
y=b+2=2+2=4;b=b-1=1;
z=(-a--)-b=-1-1=-2

注意u=v-- & u=--v的区别
前者是 先赋值后减 u=v, v=v-1
后者是 先减后赋值 v=u=v-1

首先,按顺序来:
x=--a+2=(2-1)+2=3,结束后 a=1
y=b--+2=2+2=4,结束后b=1
z=-a---b=(-1)-1=-2,结束后a=0,=1;
关键就是第三个式子,这里牵涉到运算符优先级的问题。
后缀'++'、'--'的优先级比前缀的高,所以第三个式子等效为:
z=-(a--)-b,这样你就能理解了

#include <stdio.h>
main()
{
int a=2,b=2,x,y,z;
x=--a+2;
y=b--+2;
z=-a---b; //z= (-a--) - b 之所以这样而不是z= (-a-)-- b 因为编译器在读取程序信息的时候,总是让 有意义的表达式最大话(也就是包含的符号越多越好)。

在x=--a+2中a值自减成了1
在y=b--+2中的b值自减成了1
在z=-a---b(等价于z=-(a--)-b)中a先做运算再自减成了0
这样z=-1-1=-2

热点新闻