為什么同樣的條件寫在printf里會出現不同的結果呢。
運算式a- -的值不就是a.嗎
運算式- -a的值也該是a-1之后的值啊

uj5u.com熱心網友回復:
printf是從后向前計算的,也就是a--先來,然后再--auj5u.com熱心網友回復:
受教了,謝謝大佬
uj5u.com熱心網友回復:
就算是有順序的東西,也不要一行同一個變數多次++,--,畢竟你得想一下順序,而不是瞬間過掉.uj5u.com熱心網友回復:
錯的這是未定義行為
沒規定要從后向前算
uj5u.com熱心網友回復:
這是一道選擇題里的,我自己寫肯定不會一行寫很多++--嘛
uj5u.com熱心網友回復:
先從右往左計算各運算式的值(入堆疊),再從左往右輸出各運算式的值(出堆疊)
不去找原始碼了,你查查,暫時沒找到反例
uj5u.com熱心網友回復:
錯的
printf是從后向前計算的,也就是a--先來,然后再--a
這是未定義行為
沒規定要從后向前算
那是為什么呢
uj5u.com熱心網友回復:
錯的
printf是從后向前計算的,也就是a--先來,然后再--a
這是未定義行為
沒規定要從后向前算
先從右往左計算各運算式的值(入堆疊),再從左往右輸出各運算式的值(出堆疊)
不去找原始碼了,你查查,暫時沒找到反例
uj5u.com熱心網友回復:
錯的
printf是從后向前計算的,也就是a--先來,然后再--a
這是未定義行為
沒規定要從后向前算
先從右往左計算各運算式的值(入堆疊),再從左往右輸出各運算式的值(出堆疊)
不去找原始碼了,你查查,暫時沒找到反例
值確實有問題,看來這里還是不能屏蔽這個未定義行為,不過從右向左計算還是正確的,所以下次就不要這樣寫了
uj5u.com熱心網友回復:
不過從右向左計算還是正確的
你怎么看出 從右到左是正確的??
uj5u.com熱心網友回復:
錯的
printf是從后向前計算的,也就是a--先來,然后再--a
這是未定義行為
沒規定要從后向前算
先從右往左計算各運算式的值(入堆疊),再從左往右輸出各運算式的值(出堆疊)
不去找原始碼了,你查查,暫時沒找到反例
值確實有問題,看來這里還是不能屏蔽這個未定義行為,不過從右向左計算還是正確的,所以下次就不要這樣寫了
C在線編譯器
uj5u.com熱心網友回復:
不過從右向左計算還是正確的
你怎么看出 從右到左是正確的??
行吧,在你那個編譯器上試了下printf("%d %d",a,a++),結果是0,0
這樣看起來可以徹底推翻了,應該是由壓堆疊順序決定的了,從哪向哪不能確定,網上查執行順序基本全是從右向左,剛查了下從左向右,發現了相關敘述,學到了,3q

uj5u.com熱心網友回復:
你可以試一下,這個不同編譯器的話,結果會是不同的,不要寫在輸出里,肯定與預期答案沒錯的,個人覺得沒必要糾結這個東西uj5u.com熱心網友回復:
最好不要寫這種代碼,根本沒必要人為增加代碼難度.uj5u.com熱心網友回復:
這說明函式引數,從右往左的,先執行a-- 輸出12 a本身 11
在執行--a 輸出10 a本身10
uj5u.com熱心網友回復:
++或--,在前面,先+-后再使用,否則,先使用,再操作uj5u.com熱心網友回復:
這個行為是是未定義的,C++的求值順序規則寫的很明白了。來自cppreference的截圖:
uj5u.com熱心網友回復:
a--就是先用再減,--a就是先減再用,變數在前就是先用,--在前就是先減uj5u.com熱心網友回復:
我一直理解的是a++是先用再加1,++a是先加1再用uj5u.com熱心網友回復:
看一下編譯程序中產生的匯編代碼,就明白它的計算順序了uj5u.com熱心網友回復:
求值順序和引數入堆疊順序是兩回事uj5u.com熱心網友回復:
這種問題本身沒什么實際意義,只是用于激發探索精神而已uj5u.com熱心網友回復:
錯的
printf是從后向前計算的,也就是a--先來,然后再--a
這是未定義行為
沒規定要從后向前算
得看編譯器,
uj5u.com熱心網友回復:
這個容易出現致命錯誤,找本書好好記住uj5u.com熱心網友回復:
這個容易出現致命錯誤,找本書好好記住
嗯,上次做題的時候選錯了
uj5u.com熱心網友回復:
逗號運算子是從右邊開始算了uj5u.com熱心網友回復:
printf原型有__cdecl,所以從右往左算呵呵??
uj5u.com熱心網友回復:
逗號運算子是從左到右的,可是printf原型是int __cdecl printf(const char * __restrict__ _Format,...);
__cdecl意味著引數從右到左壓入堆疊中,從右往左。
所以,
printf("%d%d",--a,a--);
=
printf("%d%d",--a,12); //a==11
=
printf("%d%d",10,12);
輸出
10 12
uj5u.com熱心網友回復:
printf原型有__cdecl,所以從右往左算
呵呵?
沒錯
uj5u.com熱心網友回復:
直接上匯編,a++多了一個保存資料的臨時變數,而++a沒有這個變數,所以能使用++a不要使用a++轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/118680.html
標籤:新手樂園
上一篇:題目:以該線性表(1,2,3,4,5,6,7,8,9,10)為測驗資料, 請撰寫主函式,測驗本講義中順序表的9個基本演算法,體領會演算法的基本思想。
下一篇:devc++,
