網(wǎng)站首頁 編程語言 正文
一、++與--操作符的本質(zhì)
++ 和 -- 操作符對應(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中,它的運行結(jié)果如下:
在 gcc 編譯器中,它的運行結(jié)果如下:
這是由于不同編譯器對 ++ 和 -- 的相對哦執(zhí)行次序不一樣。
二、++與-- 操作符使用分析
- C 語言中只規(guī)定了 ++ 和 -- 對應(yīng)指令的相對執(zhí)行次序
- ++ 和 -- 對應(yīng)的匯編指令不一定連續(xù)運行
- 在混合運算中,++ 和 -- 的匯編指令可能被打斷執(zhí)行
++ 和 -- 參與混合運算結(jié)果是不確定的。
筆試面試中的“奇葩”題
貪心法:++,-- 表達式的閱讀技巧
- 編譯器處理的每個符號應(yīng)該盡可能多的包含字符
- 編譯器以從左向右的順序一個一個盡可能多的讀入字符
- 當讀入的字符不可能和已讀入的字符組成合法符號為止
下面看一段代碼:
#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; }
運行后編譯器會報錯:
這行代碼為什么報錯呢?int j = ++i+++i+++i;
原因就是編譯器發(fā)現(xiàn) ++i 后由于貪心,會繼續(xù)往下找,發(fā)現(xiàn) ++i+ 后編譯器覺得符合語法規(guī)則,繼續(xù)往下找,當出現(xiàn) ++i++時編譯器感覺不對,開始計算,就變成 1++,這是不合法的,所以編譯器就會報錯。
空格可以作為C語言中一個完整符號的休止符編譯器讀入空格后立即對之前讀入的符號進行處理。
所以下面這么寫就可以:
#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é)
- ++ 和 -- 操作符在混合運算中的行為可能不同
- 編譯器通過貪心法處理表達式中的子表達式
- 空格可以作為C語言中一個完整符號的休止符
- 編譯器讀入空格后立即對之前讀入的符號進行處理
原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/123378988
相關(guān)推薦
- 2022-11-23 shell腳本設(shè)置日志格式的方法_linux shell
- 2023-03-25 詳解Python中命令行參數(shù)argparse的常用命令_python
- 2022-06-01 如何利用Python將字典轉(zhuǎn)為成員變量_python
- 2022-09-17 Go語言學(xué)習(xí)筆記之錯誤和異常詳解_Golang
- 2022-09-21 Python時間序列數(shù)據(jù)的預(yù)處理方法總結(jié)_python
- 2022-04-28 關(guān)于k8s中subpath的使用詳解_云其它
- 2022-06-21 Flutter實現(xiàn)單選,復(fù)選和開關(guān)組件的示例代碼_Android
- 2022-08-15 Android?Gradle模塊依賴替換使用技巧_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支