前言
-a++ ,如果a=3,那么-a++输出的结果是多少? -3还是-4?
一、首先
先来了解一下算术运算符的优先级和结合性:
运算符 | 优先级 | 结合性 | |
---|---|---|---|
++、--、+(正)、-(负) | 同级 | 高 ^ | | 低 |
右结合 |
*、/、% | 同级 | 左结合 | |
+(加)、-(减) | 同级 | 左结合 |
右结合*、/、%同级左结合+(加)、-(减)同级左结合
在C语言中,计算表达式的值也需要按运算符的优先级从高到低的顺序进行计算。
例如,表达式 a+b*c 相当于 a+(b*c).
若操作数两侧运算符的优先级相同,则按结合性(结合方向)决定计算顺序,
若结合方向为“从左到右”,则操作数先与左边的运算符结合;
若结合方向为“从右到左”,则操作数先与右边的运算符结合;
例如,表达式-a++,- 与 ++ 同级,此时按结合方向决定计算顺序(右结合),相当于 -(a++)。
二、其次
我们来运行一下 -a++ 感受一下:
#includeint main() { int a = 3; int b = 5; printf("%d\n",-a++); printf("%d\n",a); printf("%d\n",-++b); printf("%d\n",b); return 0; }
在运行结果出来之前,我们先来猜猜输出结果是怎样的? -4 4 -6 6 ?如果是这样的话大概忘记了++前置和后置了?
运行结果:
使用的编译软件:CLion
~~~结果有疑惑?请看下方解惑~~~
(初学者提示:下图中左边箭头所指即当前程序运行到这一行,运行到当前行时右边会有变量当前取值。)
图1: 此时我们发现 -a++ 中,a的值还是3,这是因为 a++ ,++后置,
所以在这里print 输出结果是-3,
图2:在这第6行运行完后,a++生效,也就是a=a+1,这时候a=4,所以在这里第7行运行print输出的结果是4。
图3:这里这个b是为了对比-a++的结果的。-++b,意思是 -(++b),++前置,那么我们先b=b+1,这时候b=6,再走-b的输出。也就是print 输出 -6。
图4:这里输出b,此时我们从第9行时b已经++b,因此b=5+1=6,所以在这里输出为6。
补充:下面讲解下3-3的例题
int a = 100; 最开始时a是100。
打印 a++; 这个printf会打印a++的值,注意是a++表达式的值,看我前面的讲解,a++的值就是a的值,也就是100。 别忘了这语句结束后a的值就会自增1(也就是副作用发生了)。
打印 ++a; 目前a的值为101。现在要打印++a表达式的值,++a的值就等于a+1,所以会打印出102。 此语句后a=101+1=102。
打印 --a; 这次要打印--a表达式的值,同自增一个道理,--a的值等于a-1,所以会打印出101。 此语句后a=102-1=101。
打印 a--; a--表达式的值就是a的值,所以打印出101。 此语句后a=101-1=100。
打印 a+1; 这表达式与自增无关,只是打印a+1的值,就是101。 对a本身的值没有影响(加法表达式没有副作用)。
打印 a; 这时a的值当然还是100了。
最后
综上,-a++ ,如果a=3,那么-a++输出的结果是-3,运算顺序还是 -(a++),只是++后置,此时a=a+1要在执行完这一行才执行,如果是++前置,那么也就是 -++a 的情况,那么输出的结果就是-4。
到此这篇关于C语言中-a++和-++a运算顺序的文章就介绍到这了,更多相关C语言-a++和-++a运算顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!