1樓:
不帶括號,實際上是這樣的效果(","優先順序略低,一般都是最後執行咯)。
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++)
個人是非常不建議這麼些,**給別人看挺麻煩。
2樓:匿名使用者
三目運算子為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);
3樓:匿名使用者
三目運算: 條件?值1:值2,是根據條件的值分別值1或值2
對於本題就是依據你的取值,分別取(temp *= 2, m++) 和(temp = (temp - n)*2-1, m++)
若把?:中:前後的兩個()去掉,會出現錯誤!
4樓:匿名使用者
運算子是有運算順序的。
比如你上面括號裡面的*運算子優先順序高於=,++也高於三目運算子。推薦你看一下運算子優先順序。
就這個程式而言,主要問題是,逗號運算子優先順序比三目運算優先順序還低,去掉括號後,造成先做了三目運算,後做逗號運算。
希望這個回答對你有幫助。
5樓:8棒棒鼠
運算是分級別的,人看不懂,電腦也就會看錯
6樓:煙禎鄂雨
表示式1?表示式2
:表示式3
這個三目運算子的作用是:如果表示式1成立,則取表示式2的值,否則取表示式3的值
上面的式子等價於:
a=3,b=4;
(a>b)?(
(b>=2)?1:2):(
(a>b)?2:1
);由於a>b不成立,所以執行
(a>b)?2:1;
由於a>b不成立,所以取1
c語言中 怎樣理解三目運算子(條件運算子)的右結合性??
7樓:
這裡涉及了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語言這個角度是無法判別的,這是個實現問題,如果要想寫出健壯的可移植的**就應該避免這種表述。
總結一下,就是先看優先順序,次看結合性,有的求值有序,有的則無序。
8樓:匿名使用者
右結合性是運算子的一種性質。對於某一箇中綴運算子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語言的條件運算子具有右結合性
9樓:匿名使用者
實際上,一條語句中出現多次同一個變數的自增或自減是不合規範的,因為這種寫法出現的結果是不確定的,根據編譯器而定。a++表示語句執行後a = a + 1,到底有多後?有2個a++怎麼辦?
這都是編譯器內部機制的問題。真正好的程式設計師是避免這種情況的。
c語言 三目運算子
10樓:匿名使用者
不帶括號,實際上是這樣的效果(","優先順序略低,一般都是最後執行咯)。 temp<=n ? (temp *= 2,m++):
(temp = (temp-n)*2-1),m++; 也就是說,不帶括號,你tempn是沒問題的。帶括號,自己比較好理解。然後,你如果想寫的高大上,簡單點又正確,可以只加後面一個括號。
即下面的方式。 temp<=n ? temp *=2,m++:
(temp=(temp-n)*2-1,m++) 個人是非常不建議這麼些,**給別人看挺麻煩。
11樓:
)前面的逗號先去掉
最後面)後的分號也去掉
c語言三目運算子問題。
12樓:陌上
如果y值為0則輸出的是後面的「no」然後回車,如果不為0則直接輸出回車。判斷語句中0為假。不為0為真。
C語言中三目運算子是什麼,C語言 三目運算子
墨汁諾 選擇運算,就是a b?c那個。三目運算子為a?b c即有三個參與運算的量。由條件運算子組成條件表示式的一般形式為 其求值規則為 如果表示式1的值為真,則以表示式2的值作為條件表示式的值,否則以表示式2的值作為整個條件表示式的值。條件表示式通常用於賦值語句之中。 尋涵衍歷氣 就是 和 這2個符...
c語言邏輯運算子問題,c語言邏輯運算子 我不明白 和 到底是怎麼運算的
x y z 優先順序,所以上式等價於 x y z 這裡 x和 y z 是同級別的,表示式從左往右掃描,x成立,後面就直接跳過,輸出100 x y z 同理,優先順序 x y z x值是0,跳過 y 但是這隻能說明 的左邊是0,右邊還是要計算的,z執行了,所以最後輸出0,1,0 說明白點,這裡的優先順...
c語言運算子
夜 晨 a 按位或 00000101 00000010 00000111 結果7b 邏輯或 只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。兩邊都為真 結果 真 非零數 c 按位與 00000101 00000010 00000000 結果 0 d 邏輯與 只要有一個為假,總的表...