網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、++與--操作符的本質(zhì)
++ 和 -- 操作符對(duì)應(yīng)兩條匯編指令
前置
- 變量自增(減)1
- 取變量值
后置
- 取變量值
- 變量自增(減)1
下面看一段神奇的代碼:
#include <stdio.h> int main() { int i = 0; int r = 0; r = (i++) + (i++) + (i++); printf("i = %d\n", i); printf("r = %d\n", r); r = (++i) + (++i) + (++i); printf("i = %d\n", i); printf("r = %d\n", r); return 0; }
在 VS2012中,它的運(yùn)行結(jié)果如下:
在 gcc 編譯器中,它的運(yùn)行結(jié)果如下:
這是由于不同編譯器對(duì) ++ 和 -- 的相對(duì)哦執(zhí)行次序不一樣。
二、++與-- 操作符使用分析
- C 語(yǔ)言中只規(guī)定了 ++ 和 -- 對(duì)應(yīng)指令的相對(duì)執(zhí)行次序
- ++ 和 -- 對(duì)應(yīng)的匯編指令不一定連續(xù)運(yùn)行
- 在混合運(yùn)算中,++ 和 -- 的匯編指令可能被打斷執(zhí)行
++ 和 -- 參與混合運(yùn)算結(jié)果是不確定的。
筆試面試中的“奇葩”題
貪心法:++,-- 表達(dá)式的閱讀技巧
- 編譯器處理的每個(gè)符號(hào)應(yīng)該盡可能多的包含字符
- 編譯器以從左向右的順序一個(gè)一個(gè)盡可能多的讀入字符
- 當(dāng)讀入的字符不可能和已讀入的字符組成合法符號(hào)為止
下面看一段代碼:
#include <stdio.h> int main() { int i = 0; int j = ++i+++i+++i; int a = 1; int b = 4; int c = a+++b; int* p = &a; b = b/ *p; printf("i = %d\n", i); printf("j = %d\n", j); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
運(yùn)行后編譯器會(huì)報(bào)錯(cuò):
這行代碼為什么報(bào)錯(cuò)呢?int j = ++i+++i+++i;
原因就是編譯器發(fā)現(xiàn) ++i 后由于貪心,會(huì)繼續(xù)往下找,發(fā)現(xiàn) ++i+ 后編譯器覺(jué)得符合語(yǔ)法規(guī)則,繼續(xù)往下找,當(dāng)出現(xiàn) ++i++時(shí)編譯器感覺(jué)不對(duì),開(kāi)始計(jì)算,就變成 1++,這是不合法的,所以編譯器就會(huì)報(bào)錯(cuò)。
空格可以作為C語(yǔ)言中一個(gè)完整符號(hào)的休止符編譯器讀入空格后立即對(duì)之前讀入的符號(hào)進(jìn)行處理。
所以下面這么寫(xiě)就可以:
#include <stdio.h> int main() { int i = 0; int j = ++i + ++i + ++i; int a = 1; int b = 4; int c = a++ + b; int* p = &a; b = b/ *p; printf("i = %d\n", i); printf("j = %d\n", j); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
編譯結(jié)果如下:
三、小結(jié)
- ++ 和 -- 操作符在混合運(yùn)算中的行為可能不同
- 編譯器通過(guò)貪心法處理表達(dá)式中的子表達(dá)式
- 空格可以作為C語(yǔ)言中一個(gè)完整符號(hào)的休止符
- 編譯器讀入空格后立即對(duì)之前讀入的符號(hào)進(jìn)行處理
原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/123378988
相關(guān)推薦
- 2022-03-17 Golang動(dòng)態(tài)調(diào)用方法小結(jié)_Golang
- 2022-04-16 pytorch?collate_fn的基礎(chǔ)與應(yīng)用教程_python
- 2022-12-28 詳解Go語(yǔ)言strconv與其他基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換函數(shù)的使用_Golang
- 2022-07-10 css中border屬性設(shè)置
- 2023-01-17 Android?Handler消息傳遞機(jī)制_Android
- 2022-08-23 python實(shí)現(xiàn)GATK多線程加速示例_python
- 2022-08-19 MapReduce讀取定長(zhǎng)文件入庫(kù)Hive表Orc格式
- 2022-05-10 ASP.NET?Core使用Log4net實(shí)現(xiàn)日志記錄功能_實(shí)用技巧
- 最近更新
-
- 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概述快速入門(mén)
- 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)程分支