網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
-a++ ,如果a=3,那么-a++輸出的結(jié)果是多少? -3還是-4?
一、首先
先來(lái)了解一下算術(shù)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性:
運(yùn)算符 | 優(yōu)先級(jí) | 結(jié)合性 | |
---|---|---|---|
++、--、+(正)、-(負(fù)) | 同級(jí) |
高 ^ | | 低 |
右結(jié)合 |
*、/、% | 同級(jí) | 左結(jié)合 | |
+(加)、-(減) | 同級(jí) | 左結(jié)合 |
右結(jié)合*、/、%同級(jí)左結(jié)合+(加)、-(減)同級(jí)左結(jié)合
在C語(yǔ)言中,計(jì)算表達(dá)式的值也需要按運(yùn)算符的優(yōu)先級(jí)從高到低的順序進(jìn)行計(jì)算。
例如,表達(dá)式 a+b*c 相當(dāng)于 a+(b*c).
若操作數(shù)兩側(cè)運(yùn)算符的優(yōu)先級(jí)相同,則按結(jié)合性(結(jié)合方向)決定計(jì)算順序,
若結(jié)合方向?yàn)椤皬淖蟮接摇保瑒t操作數(shù)先與左邊的運(yùn)算符結(jié)合;
若結(jié)合方向?yàn)椤皬挠业阶蟆保瑒t操作數(shù)先與右邊的運(yùn)算符結(jié)合;
例如,表達(dá)式-a++,- 與 ++ 同級(jí),此時(shí)按結(jié)合方向決定計(jì)算順序(右結(jié)合),相當(dāng)于 -(a++)。
二、其次
我們來(lái)運(yùn)行一下 -a++ 感受一下:
#include <stdio.h>
int 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;
}
在運(yùn)行結(jié)果出來(lái)之前,我們先來(lái)猜猜輸出結(jié)果是怎樣的? -4? 4 -6? 6 ?如果是這樣的話大概忘記了++前置和后置了?
運(yùn)行結(jié)果:
使用的編譯軟件:CLion
~~~結(jié)果有疑惑?請(qǐng)看下方解惑~~~
(初學(xué)者提示:下圖中左邊箭頭所指即當(dāng)前程序運(yùn)行到這一行,運(yùn)行到當(dāng)前行時(shí)右邊會(huì)有變量當(dāng)前取值。)
圖1: 此時(shí)我們發(fā)現(xiàn) -a++ 中,a的值還是3,這是因?yàn)?a++ ,++后置,
所以在這里print 輸出結(jié)果是-3,
圖2:在這第6行運(yùn)行完后,a++生效,也就是a=a+1,這時(shí)候a=4,所以在這里第7行運(yùn)行print輸出的結(jié)果是4。
?圖3:這里這個(gè)b是為了對(duì)比-a++的結(jié)果的。-++b,意思是 -(++b),++前置,那么我們先b=b+1,這時(shí)候b=6,再走-b的輸出。也就是print 輸出 -6。
?圖4:這里輸出b,此時(shí)我們從第9行時(shí)b已經(jīng)++b,因此b=5+1=6,所以在這里輸出為6。
補(bǔ)充:下面講解下3-3的例題
int a = 100; 最開(kāi)始時(shí)a是100。
打印 a++; ?這個(gè)printf會(huì)打印a++的值,注意是a++表達(dá)式的值,看我前面的講解,a++的值就是a的值,也就是100。 別忘了這語(yǔ)句結(jié)束后a的值就會(huì)自增1(也就是副作用發(fā)生了)。
打印 ++a; ?目前a的值為101。現(xiàn)在要打印++a表達(dá)式的值,++a的值就等于a+1,所以會(huì)打印出102。 此語(yǔ)句后a=101+1=102。
打印 --a; ?這次要打印--a表達(dá)式的值,同自增一個(gè)道理,--a的值等于a-1,所以會(huì)打印出101。 此語(yǔ)句后a=102-1=101。
打印 a--; ?a--表達(dá)式的值就是a的值,所以打印出101。 此語(yǔ)句后a=101-1=100。
打印 a+1; ?這表達(dá)式與自增無(wú)關(guān),只是打印a+1的值,就是101。 對(duì)a本身的值沒(méi)有影響(加法表達(dá)式?jīng)]有副作用)。
打印 a; ?這時(shí)a的值當(dāng)然還是100了。
最后
綜上,-a++ ,如果a=3,那么-a++輸出的結(jié)果是-3,運(yùn)算順序還是 -(a++),只是++后置,此時(shí)a=a+1要在執(zhí)行完這一行才執(zhí)行,如果是++前置,那么也就是 -++a 的情況,那么輸出的結(jié)果就是-4。
原文鏈接:https://blog.csdn.net/c_lanxiaofang/article/details/127731465
相關(guān)推薦
- 2022-03-28 通過(guò)numba模塊給Python代碼提速的方法詳解_python
- 2022-12-03 Python學(xué)習(xí)之列表和元組的使用詳解_python
- 2023-02-04 Rust?語(yǔ)言的全鏈路追蹤庫(kù)?tracing使用方法_Rust語(yǔ)言
- 2022-03-29 python實(shí)現(xiàn)二叉排序樹_python
- 2022-02-24 詳細(xì)整理Oracle中常用函數(shù)_oracle
- 2022-11-09 Android性能優(yōu)化之plt?hook與native線程監(jiān)控詳解_Android
- 2022-03-30 C語(yǔ)言入門之淺談數(shù)據(jù)類型和變量常量_C 語(yǔ)言
- 2022-07-15 SQL?Server創(chuàng)建用戶定義函數(shù)_MsSql
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支