C語言簡明講解操作符++和--的使用方法
一、++與--操作符的本質(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é)果是不確定的。
筆試面試中的“奇葩”題

貪心法:++,-- 表達(dá)式的閱讀技巧
- 編譯器處理的每個符號應(yīng)該盡可能多的包含字符
- 編譯器以從左向右的順序一個一個盡可能多的讀入字符
- 當(dā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ù)往下找,當(dāng)出現(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é)
- ++ 和 -- 操作符在混合運算中的行為可能不同
- 編譯器通過貪心法處理表達(dá)式中的子表達(dá)式
- 空格可以作為C語言中一個完整符號的休止符
- 編譯器讀入空格后立即對之前讀入的符號進行處理
到此這篇關(guān)于C語言簡明講解操作符++和--的使用方法的文章就介紹到這了,更多相關(guān)C語言 ++和--內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(101.判斷對稱樹)
這篇文章主要介紹了C++實現(xiàn)LeetCode(101.判斷對稱樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

