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

2021-05-17 11:30:37 字數 5840 閱讀 4126

1樓:

這裡涉及了c中的優先順序、結合性、求值順序。

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

對於?:,在c中與它優先順序相同的只有它自己,因此只有連續的?:才會體現出它的右結合性,即a?

b:c?d:

e中,根據右結合性可知應理解為a?b:(c?

d:e)。顯然,上述問題中是體現不出這種結合性來的。

再者,還有一個求值順序的問題,a?b:c中,c語言規定先對a求值,非零則對b求值並作為該表示式的值,為零則對c求值並作為表示式的值,並且b和c中有且僅有一個會被求值。

對於題目中的就應該是:先進行(--a == b++)的求值,根據是否為零,會對(a++)或(b++)進行求值。說白了,也就是隻有兩種可能性:

可能性1:先算(--a == b++),再算(a++);可能性2:先算(--a == b++),再算(b++)。

至於(--a == b++)中到底是先算--a 還是b++則僅從c語言這個角度是無法判別的,這是個實現問題,如果要想寫出健壯的可移植的**就應該避免這種表述。

總結一下,就是先看優先順序,次看結合性,有的求值有序,有的則無序。

2樓:年定籍菱

右結合性是運算子的一種性質。對於某一箇中綴運算子op,如果aopbop

c等價於aop

(bopc)

就可以說運算子具有右結合性。

對於c語言的條件運算子

a?b:c

而言,判斷優先順序和結合性的時候,中間的表示式b不納入判斷。c語言的條件運算子具有這樣的性質:a?

b:c?

d:e等價於a?

b:(c?

d:e),因此一些人說c語言的條件運算子具有右結合性

3樓:載瑰瑋愈閒

c語言中右結合的運算子有:

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

4樓:

這裡涉及了c中的優先順序、結合性、求值順序。

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

對於?:,在c中與它優先順序相同的只有它自己,因此只有連續的?:才會體現出它的右結合性,即a?

b:c?d:

e中,根據右結合性可知應理解為a?b:(c?

d:e)。顯然,上述問題中是體現不出這種結合性來的。

再者,還有一個求值順序的問題,a?b:c中,c語言規定先對a求值,非零則對b求值並作為該表示式的值,為零則對c求值並作為表示式的值,並且b和c中有且僅有一個會被求值。

對於題目中的就應該是:先進行(--a == b++)的求值,根據是否為零,會對(a++)或(b++)進行求值。說白了,也就是隻有兩種可能性:

可能性1:先算(--a == b++),再算(a++);可能性2:先算(--a == b++),再算(b++)。

至於(--a == b++)中到底是先算--a 還是b++則僅從c語言這個角度是無法判別的,這是個實現問題,如果要想寫出健壯的可移植的**就應該避免這種表述。

總結一下,就是先看優先順序,次看結合性,有的求值有序,有的則無序。

5樓:匿名使用者

右結合性是運算子的一種性質。對於某一箇中綴運算子op,如果 a op b op c 等價於 a op ( b op c) 就可以說運算子具有右結合性。

對於c語言的條件運算子 a?b:c 而言,判斷優先順序和結合性的時候,中間的表示式 b 不納入判斷。

c語言的條件運算子具有這樣的性質: a ? b :

c ? d : e 等價於 a ?

b : (c ? d :

e),因此一些人說c語言的條件運算子具有右結合性

6樓:匿名使用者

實際上,一條語句中出現多次同一個變數的自增或自減是不合規範的,因為這種寫法出現的結果是不確定的,根據編譯器而定。a++表示語句執行後a = a + 1,到底有多後?有2個a++怎麼辦?

這都是編譯器內部機制的問題。真正好的程式設計師是避免這種情況的。

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

7樓:匿名使用者

右結合性是運算子的一種性質。對於某一箇中綴運算子op,如果 a op b op c 等價於 a op ( b op c) 就可以說運算子具有右結合性。

對於c語言的條件運算子 a?b:c 而言,判斷優先順序和結合性的時候,中間的表示式 b 不納入判斷。

c語言的條件運算子具有這樣的性質: a ? b :

c ? d : e 等價於 a ?

b : (c ? d :

e),因此一些人說c語言的條件運算子具有右結合性

c語言三目運算子怎麼用

8樓:天雲一號

c語言中只有一個三目運算子,就是條件運算子(? :)條件運算子的一般使用格式如下:

表示式1 ? 表示式2 : 表示式3

舉例如下:

max = (a>b) ? a : b; // 取變數a, b中較大的一個,並賦值給變數max

9樓:匿名使用者

三目運算子為a?b:c即有三個參與運算的量。由條件運算子組成條件表示式的一般形式為:

表示式1? 表示式2: 表示式3

其求值規則為:如果表示式1的值為真,則以表示式2 的值作為條件表示式的值,否則以表示式2的值作為整個條件表示式的值。 條件表示式通常用於賦值語句之中。

例如條件語句:

if(a>b) max=a;

else max=b;

可用條件表示式寫為 max=(a>b)?a:b; 執行該語句的語義是:如a>b為真,則把a賦予max,否則把b 賦予max。

使用條件表示式時,還應注意以下幾點:

1. 條件運算子的運算優先順序低於關係運算子和算術運算子,但高於賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b

2. 條件運算子?和:是一對運算子,不能分開單獨使用。

3. 條件運算子的結合方向是自右至左。

例如:a>b?a:c>d?c:d應理解為

a>b?a:(c>d?c:d) 這也就是條件表示式巢狀的情形,即其中的表示式3又是一個條

件表示式。

void main(){

int a,b,max;

printf("\n input two numbers: ");

scanf("%d%d",&a,&b);

printf("max=%d",a>b?a:b);

10樓:匿名使用者

三目運算子是?:結構的運算

所謂三目就是需要三個變數對能進行運算的操作舉個簡單的例子:

a=2>1?3:4

可分成幾個部分,用括號分開:

(a=)(2>1)?(3):(4)

最左邊是賦值操作

第二個部分是一個判斷

第三和第四部分是兩個常數

首先判斷第三部分是否成立,成立即選擇第三部分,否則選擇第四部分像上面那個2>1成立,所以就執行了a=3

這種運算還可以巢狀

比如判斷year是不是閏年,是則返回1,不是返回0year=(year%100==0)?(year%400==0?1:0):(year%4==0?1:0)

11樓:

不帶括號,實際上是這樣的效果(","優先順序略低,一般都是最後執行咯)。

temp<=n ? (temp *= 2,m++):(temp = (temp-n)*2-1),m++;

也就是說,不帶括號,你temp<=n成立時候,m++總是會執行兩次,當然對於temp>n是沒問題的。

帶括號,自己比較好理解。

然後,你如果想寫的高大上,簡單點又正確,可以只加後面一個括號。即下面的方式。

temp<=n ? temp *=2,m++:(temp=(temp-n)*2-1,m++)

個人是非常不建議這麼些,**給別人看挺麻煩。

12樓:匿名使用者

三目運算: 條件?值1:值2,是根據條件的值分別值1或值2

對於本題就是依據你的取值,分別取(temp *= 2, m++) 和(temp = (temp - n)*2-1, m++)

若把?:中:前後的兩個()去掉,會出現錯誤!

13樓:匿名使用者

運算子是有運算順序的。

比如你上面括號裡面的*運算子優先順序高於=,++也高於三目運算子。推薦你看一下運算子優先順序。

就這個程式而言,主要問題是,逗號運算子優先順序比三目運算優先順序還低,去掉括號後,造成先做了三目運算,後做逗號運算。

希望這個回答對你有幫助。

14樓:匿名使用者

條件操作符是一個三目操作符

條件表示式?表示式1:表示式2

先計算條件表示式,若為真,對表示式1求值,求值的結果為整個條件操作符表示式的值;

若為假,對表示式2求值,求值的結果為整個條件操作符表示式的值。

如:s = ( x < 0 ) ? -1 : x * x;

表示當x<0時返回-1;當x>=0是返回x平方。

15樓:匿名使用者

a>b:a?b

如果a大於b返回a 如果相反則返回b

c語言右結合性的運算子?

16樓:蝶夢の姬

c語言中右結合的

運算子有:

(1)!邏輯非運算子;~按位取反運算子;++字首增量運算子;--字首減量運算子;+正號運算子;-負號運算子;(型別)型別轉換運算子;*指標運算子;&地址運算子;sizeof長度運算子

(2)? :條件運算子

(3)=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=賦值運算子

17樓:儒雅的小濤

單目運算子

條件運算子

賦值運算子

c語言中三目運算子是什麼?

18樓:匿名使用者

三目運算子為a?b:c即有三個參與運算的量。由條件運算子組成條件表示式的一般形式為:

表示式1? 表示式2: 表示式3

其求值規則為:如果表示式1的值為真,則以表示式2 的值作為條件表示式的值,否則以表示式2的值作為整個條件表示式的值。 條件表示式通常用於賦值語句之中。

例如條件語句:

if(a>b) max=a;

else max=b;

可用條件表示式寫為 max=(a>b)?a:b; 執行該語句的語義是:如a>b為真,則把a賦予max,否則把b 賦予max。

使用條件表示式時,還應注意以下幾點:

1. 條件運算子的運算優先順序低於關係運算子和算術運算子,但高於賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b

2. 條件運算子?和:是一對運算子,不能分開單獨使用。

3. 條件運算子的結合方向是自右至左。

例如:a>b?a:c>d?c:d應理解為

a>b?a:(c>d?c:d) 這也就是條件表示式巢狀的情形,即其中的表示式3又是一個條

件表示式。

void main()

用條件表示式對上例重新程式設計,輸出兩個數中的大數。

c語言中條件運算子是怎樣的法則C語言中條件運算子是什麼意思

由高到低是 非 與 或 左邊為0則不看右邊運算,左邊為1不看右邊 例 main 執行結果 a 1 b 0c 3 d 1程式執行說明 先執行 b a即0 a,結果為0 b 0 再執行0 c結果為0,執行c 2結果為10 1結果為1 因為執行順序為右結合,所以將整個表示式的結果給 d為1 條件運算子 表...

c語言中位移位運算子C語言中位移位運算子

位移運算子 符號 描述 左移 右移 位移運算子作用於其左側的變數,其右側的表示式的值就是移動的位數,運算結果就是移動後的變數結果。b a 2 就是a的值左移兩位並賦值為b。a本身的值並沒有改變。向左移位就是在低位補0,向右移位就是在高位上補0。右移時可以保持結果的符號位,也就是右移時,如果最高位為1...

c語言中邏輯運算子用法,C語言中邏輯運算子用法

1 邏輯運算子bai是根據du表示式的值來返zhi回真值或是假值dao。在c語言中沒有專版門的真值和假值,認定權非0為真值,0為假值。2 邏輯運算子運算規則 或 兩個條件中,只要有一個成立,則結果就成立 與 兩個條件中,兩個同時成立,則結果成立,否則不成立 非 取反之意,如果是真,結果是假,如果是假...