C語言單目運算子的結合性問題,C語言中,逗號運算子和條件運算子還有單目運算子有沒有結合性

2022-12-10 02:56:29 字數 5571 閱讀 6473

1樓:匿名使用者

c = a+++b; 等價於 (a++)+b你說的 a+++b 為什麼不是 a + (++b) ,是因為編譯器解釋一行**的先後順序,編譯器在解析**時是按從左到右的順序來的。

在碰到 字母 a 後,向右解析, 發現了 a+ 這兩個字母,a+中的 + 可以是 + 號運算子, 也可以是 自增運算子,編譯器不能確定,只能再向右解析,又碰到一個+,就變成了 a++了,這時是一個自增運算表示式,但編譯器仍向右解析,又碰到了一個+,變成了 a+++,但是 c++語言中這種表示式是非法的,所以將碰到的這個 + 變成 "+" 運算子,最後向右解析到 得到 b ,將表示式轉換成 (a++)+b, 同樣的道理,可以推匯出

a+++++b; 不會解釋成 (a++) + (++b),因為編譯器解釋**時從左到右的順序。 初學者對於這個問題不必過於深究。

2樓:匿名使用者

a+++b的意思是在執行完這句話之後,a會再自增一次。

也就是先執行a+b,然後a再自增一。

編譯器的在編譯時是從左到右匹配運算子的,所以這個是編譯器規定的。

3樓:不可能無人註冊

故意整編繹器的是吧。同等的由左算起,+++編輯器會分成++,+這樣用運算子,效率很低,建議別試這些沒用的

4樓:匿名使用者

++a比a++的優先順序高,記住就好了

5樓:匿名使用者

忘得差不多了,這種問題純粹是為了糾結人的,個人感覺沒必要深究,很多時候標準對這些情況都沒有定義.如果不是為了考試的話,基本上不會遇見這樣的**

6樓:匿名使用者

很簡單,因為後自增的優先順序比前自增高,所以優先結合為後自增,這個問題很基礎,翻一下書就可以了

c語言中,逗號運算子和條件運算子還有單目運算子有沒有結合性?

7樓:慶興運謝施

c語言中,逗號運算子和條件運算子還有單目運算子是有結合性的,逗號運算子

左結合性

條件運算子

右結合性

單目運算子:

++、--、+(正)-(負)、*、&、!

右結合性

8樓:頻平和騎筠

這裡指的條件運算子是?:運算子,它的結合性是自右向左的

9樓:乘心宜於初

它們3個都有結合性;

逗號運算子是左結合性;例如:a=10,b=3,c=a+b;這個逗號運算子從左到右執行,最後c=13;

條件運算子具有右結合性;例如:表示式1?表示式2:表示式3;該三目運算子,優先順序比較低,右結合性;

單目運算子如:++,-

-,!,&,*等都是右結合性

c語言中單目運算子,結合性從左到右,分別是什麼意思??

10樓:萊以南臺雄

單目運算子:只有一個運算元的運算子,如負號。對應的有雙目運算子(即需要兩個運算元,如除號/,大多為雙目)和三目運算子(唯一一個為?表示式)

結合性:是指當一個運算元左右各有一個運算子時,按運算子優先順序決定運算次序,當優先順序相同時,按結合性決定運算次序。

c語言 優先和結合性

11樓:賺錢使用者

i++ 和++i 的區別在於前者是先賦值再自增,後者剛好相反!

12樓:七夜少俠

到第四個printf("%d\n",i--);後i不就成了9了麼,

-i++自然就是-8了。

13樓:

關於優先順序和結合性的問題,先給你一個建議,就是不要寫讓別人看不懂或者甚至是自己都不知道到底怎麼執行的程式,這點你現在可能體會不深,等你再深入學習一段時間後你就會發現它的重要性了~

好了,切入正題,在表示式求值的時候,我們要按照優先順序級別高低依次執行,比如先執行乘除運算再進行加減運算,比如a+b*c,有兩個運算子+,*,我們知道乘號的優先順序大於加號,所以先執行乘號,再比如你的例子,x-y+z,加號和減號優先順序相同,所以按照從左往右的順序依次執行~(相同優先順序的運算還牽扯到結合方向,我們後面會談到~)這時候你可能會問「我怎麼知道哪個運算子優先順序高啊?」,不要著急,你可以在你的c 語言教材後面的附錄裡找到,可以大概看一下,最好有意識地記一下,比如初等運算子級別大於〉單目運算子〉算數運算子〉關係運算子〉邏輯運算子〉條件運算子〉賦值運算子〉逗號運算子……

所謂結合順序,就是運算子和哪個變數結合的問題,是左面的還是右面的~在c語言中,算術運算子的結合方向是從左向右,而++的結合方向就是從右向左,應該注意一點,結合性是c語言的特點之一,別的語言中都沒有,所以要特別注意

比如你上面那個例子,-i++,負號和自減運算子優先順序一樣,而它們的優先順序是從右到左,也就是說先進行i++,再進行負號運算,所以這時候輸出的是-8,如果這時候你再輸出i,i 現在的值是多少呢?因為i進行了自加運算,所以這時候應該是9,明白了嗎?

最後我想囉嗦幾個你以後可能會犯的錯誤或者容易造成誤解的地方

比如這麼一個表示式(i++)+(i++)+(i++),你打算怎麼算他呢,所以我開始建議你不要寫容易讓人混淆的句子,因為不同的編譯器對這個處理是不一樣的,如果i的初值是3,有的編譯器就是從左到右計算括號裡的表示式,結果就是3+4+5=12,而有的編譯器就會同時計算括號的值,即3+3+3=9,然後再對i進行三次自加運算,i變成6;

再比如i+++i,這個應該怎麼算呢?在編譯器裡,一般儘可能的從左向右將若干個字元組成一個運算子,所以是(i++)+i

最後說一點,比如printf("%d,%d",i,i++),i的初值是3,那麼回輸出什麼呢?大多數編譯器會從左到右,這樣就輸出了3,3,而也有一些編譯器會從右到左,那麼就會輸出4,3

因為內容比較多,所以說的可能有不清楚的地方,希望你能理解

還是希望對你有幫助~

在c語言中,逗號運算子的優先順序最低對嗎

14樓:匿名使用者

是的,逗號運算子低於賦值運算子。

在c語言中,逗號運算子的為了把幾個表示式串在一起。整個逗號表示式的值是以逗號分隔的列表中的最後一個表示式的值。

最右邊的那個表示式的值將作為整個逗號表示式的值,其他表示式的值會被丟棄。

例如:var = (count=12, incr=10, count+1);

在這裡,首先把 count 賦值為12,把incr賦值為10,然後把count加1。最後,把最右邊表示式 count+1的計算結果13,賦給var。上面表示式中的括號是必需的,因為逗號運算子的優先順序低於賦值操作符。

擴充套件資料

寫一段c語言程式,j最初的值為10,然後自增到11,接著再加上100 並將結果賦值給 j,最後 j 再加上999,得出結果1110。

程式**如下:

#include using namespace std;

int main();

15樓:大野瘦子

對的,逗號操作符具有最低的優先順序。

所有的優先順序中,只有三個優先順序是從右至左結合的,它們是單目運算子、條件運算子、賦值運算子,其它的都是從左至右結合。具有最高優先順序的其實並不算是真正的運算子,它們算是一類特殊的操作。

()是與函式相關,與陣列相關,而->及.是取結構成員,其次是單目運算子,所有的單目運算子具有相同的優先順序,因此在真正的運算子中它們具有最高的優先順序。

c語言運算子的優先順序

一、從上往下  運算子優先順序依次降低

1、括號以及  .(結構體變數運用成員運算子)   ->(結構體指標引用成員運算子)2.單目運算子:

!   ~  ++  --  &(取地址符)   *(取內容)   sizeof()

2、單目運算子: !   ~  ++  --  &(取地址符)   *(取內容)   sizeof()

3、算數運算子:

*   /   %

+   -

4、位運算子: <<   >>

5、關係運算子:

>=  >   <  <=

==       !=

6、位運算子:&  ^  |

7、邏輯運算子: &&  ||

8、條件運算子: ?:

9、(複合)賦值運算子: =   +=   -=  ....

10、逗號運算子: ,

二、左結合(從右向左運算):(複合)賦值運算子、邏輯非、取反(~ )、前置自增減運算子

右結合(從左向右運算)

注意逗號運算子的用法:

帶有括號的表示式,先從表示式1開始計算,依次類推,最終表示式n的值是整個表示式的值。

不帶有括號的表示式,從表示式1開始計算,依次類推:

int a,b;

int c = (a = 10,b = 30, a= a+b,b = a+b);//  c = 70

b = a = 10,b = 30, a= a+b;//  b = 30

16樓:哇哎西西

對,在c程式中,逗號運算子的優先順序最低。

c語言中,運算子的運算優先順序共分為15 級。1 級最高,15 級最低。 在表示式中,優先順序較高的先於優先順序較低的進行運算。

而在一個運算量兩側的運算子 優先順序相同時,則按運算子的結合性所規定的結合方向處理。

結合性:c語言中各運算子的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算子的結合性是自左至右,即先左後右。

如有表示式x-y+z 則y 應先與「-」號結合,執行x-y 運算,然後再執行+z 的運算。這種自左至右的結合 方向就稱為「左結合性」。

而自右至左的結合方向稱為「右結合性」。最典型的右結合 性運算子是賦值運算子。如x=y=z,由於「=」的右結合性,應先執行y=z 再執行x=(y=z)運算。

c語言運算子中有不少為右結合性,應注意區別,以避免理解錯誤。

優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。

擴充套件資料:

c語言運算子號的種類

1、算術運算子

用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運算,%)、自增(++)、自減(--)共七種。

2、關係運算子

用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。

3、邏輯運算子

用於邏輯運算。包括與(&&)、或(||)、非(!)三種。

4、位操作運算子

參與運算的量,按二進位制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。

5、賦值運算子

用於賦值運算,分為簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。

6、條件運算子

這是一個三目運算子,用於條件求值(?:)。

7、逗號運算子

用於把若干表示式組合成一個表示式(,)。

8、指標運算子

用於取內容(*)和取地址(&)二種運算。

9、求位元組數運算子

用於計算資料型別所佔的位元組數(sizeof)。

10、特殊運算子

有括號(),下標,成員(→,.)等幾種。

關於c 三目運算子的問題,C 三目運算子問題

可以這bai麼分割 d a b?c d a?a c b 意思是這樣第du 一個三木運算子如zhi果a b非零結果則 d c d a?a c 為零則dao為版d b 第二個,先權令c d a 然後同理 c 非零結果為 a 為零則結果為c 你可以自己測幾組資料試試,不明白可以追問。比如 int a 1 ...

c語言運算子,C語言 運算子 是怎麼運算的

9除以5商1餘4 不是說小數最後位是餘數 餘數就是在整數的除法中,只有能整除與不能整除兩種情況。當不能整除時,就產生餘數,所以餘數問題在小學數學中非常重要。餘數有如下一些重要性質 a,b,c均為自然數 1 餘數小於除數。2 被除數 除數 商 餘數 除數 被除數 餘數 商 商 被除數 餘數 除數。3 ...

C語言中怎樣理解三目運算子(條件運算子)的右結合性

這裡涉及了c中的優先順序 結合性 求值順序。結合性只有在相同優先順序的運算子間才起作用,比如a b c,與 優先順序不同,這裡根本不用去管結合性。而a b c則需要進行結合性考慮了,如果 為左結合性,那麼應該理解為 a b c,如果 為右結合性,那麼應該理解為a b c 當然了,我們已經知道 為左結...