cout運算順序,C 中關於cout的輸出順序問題

2022-12-09 17:36:18 字數 4158 閱讀 3346

1樓:monkey家園

①首先:

cout是什麼?是一個類的例項化物件(某種流型別的)。

②其次:

<< 是什麼?是操作符過載,實際上cout< 結果是變數a (此時a沒有壓棧或者說沒有被傳入func函式)

x; => 結果是變數x

function(x); => 返回結果假設是k

endl; =>結果是endl

cout.func(a); => 結果是返回一個物件c

c.func(k); => 結果是返回一個物件c2

c2.func(endl); => 結果是返回一個物件c3

c++和c不同,c的 printf("%d",(++a)+(++a)+(++a)); 等效於 printf("%d",(1+a)+(2+a)+(3+a));

這是由於c編譯器用的是比較古老的編譯器設計觀念。

還有最後一點,c++這種特性到逗號表示式(不包括實參列表)為止為最小粒度。

我們把((cout.func(a)).func(function(x))).func(endl); 改為:

((cout.func(a)).func(function(x))).func(endl),++a;

後面的++a不會影響前面的函式呼叫。

而((cout.func(a)).func(function(++a))).func(endl);

會影響。

這就是因為逗號表示式是最小表示式粒度的原因 。

⑤ 不知道你理解沒有,沒有+q 739227481

2樓:釋竹陽花

你定義的a是全域性變數,所以函式體裡的呼叫將相應改變它的取值。

3樓:

當一個函式作為函式引數時,引數總是先要計算出來,外邊的函式才能執行的。其實《也是一個函式,是一個運算子的過載。所以 function(x)作為cout《的一個引數, function(x)先執行,然後這句cout才輸出。

而如果有多個這樣的函式時,編譯程式會依次把函式壓入堆疊,直到引數全部算出後才會傳入函式調外層函式。所以,cout << a << function(x) << endl執行時,先壓入a,再壓入 function(x) ,然後 function(x) 執行,a變成2,再讀a,所有堆疊內函式執行完,輸出

所以得出22而不是12,這樣說明白了吧

4樓:一路奔天涯

因為在定義function時 你寫的是a=2; 而不是 int a=2; 後面用到的這個a 一直是全域性變數 故都為2

5樓:我是百人敵

可以想象成printf("%d %d", a, function(a));

引數從右到左入棧,function(a)先執行,所以a入棧時,已經是2了

**我的答案是錯的,但是刪不掉了

6樓:匿名使用者

#include

using namespace std;

int a=1;

int function(int x)

int main()

int f2()

int f3()

int main()

看看這段**,輸出的結果是2234,也就是說cout的《運算子先依次壓入f3(),f2(),f1(),a的改變是這樣的,原先a=1;在f3()壓入時a=4,f2()壓入a=3,f1()壓入a=2;執行的時候就是a=2輸出兩次,然後f1()出棧,輸出a=3,f2()出棧,再輸出4

c++中關於cout的輸出順序問題

7樓:匿名使用者

這個屬於未定義行為,**中是不應該這麼寫的。

若操作符有兩個以上的運算元(例如a+b中,+有兩個運算元),則求這兩個運算元的值的順序未定義(也就是說,先求a的值還是先求b的值是未確定的)。

你的 cout<

中的strlwr(a) 和 strup(a) 兩個操作是不應該有先後順序的,但事實是這兩個誰先求值會導致結果的不同,所以是不符合c和c++標準的行為。

比如 int a = 10,c;

c = a++ + ++a + a-- + --a;

我們不能確定四個相加的表示式哪一個先求值,所以也就不能確定最後c的值是多少。

8樓:

c++可沒有固定了運算順序,只定義了運算優先順序。編譯器覺得怎樣的運算順序方便一些就怎樣做。所以你最好這樣寫

c++運算順序的問題

9樓:匿名使用者

結果是 a=2 b=1 c=1

因為a=1,++運算優先順序高於||,計算++a後,a=2;後面跟著的是「||」運算子,不管「||」後面是什麼,結果肯定是真,c++有邏輯短路演算法,所以它不會再去計算||後面的表示式,++b與++c就不會執行了。

如果表示式是 ++a||++b&&++c,且a初值=-1,先計算++a後,a=0,||後面的++b與++c才會被運算。

10樓:匿名使用者

++a||++b&&++c

等價於:

(++a)||(++b&&++c)

計算順序是從左向右,也就是說會先計算++a,由於a=1,所以++a後a=2,並且(++a)的值也就是2,由於||操作符具有短路求值特性,而且(++a)的值不為0,所以後面的(++b&&++c)將不再計算,直接返回1.

所以執行這個表示式之後,a=2,b=c=1關於短路求值,請參考:

11樓:

都是2,各變數都加1。

12樓:

||和&&是有短路計算的

意思就是說

||只要有一方是真,整個表示式就是真,所以,如果||前面的是真,就不需要再計算後面的表示式了

&&必須兩方都是真,換句話說,就是隻要一方是假整個表示式就是假,所以,如果&&前的的假,就不需要計算面後的表示式了

這個例子中,++a=2,為真,後面的就都不再計算,所以a=2,b=1,c=1

c++程式,為什麼cout輸出的順序會是這樣呢?

13樓:汪好帥

同樣的道理,cout輸出函式是從右向左運算的。

即為先從最後面一個a++開始 1,之後a = 2;

++a; a為3

a++; a先為3 之後變成4++a; a =5

輸出5 3 3 1.

你針對這個再分開試試,就知道,cout輸出函式是從右向左運算的了。

滿意請採納

14樓:匿名使用者

這說明函式的引數入棧順序是從右往左。

先將最右邊的a++入棧,入棧的值是1,然後a變成2再將右邊的++a入棧,入棧的值是3,a變成3再將第2個a++入棧,入棧的值是3,a變成4最後將第1個++a入棧,入棧的值是5,a變成5

15樓:很好吃啊

c++中的main函式是帶返回值的。一般寫成int main();在程式執行完了之後用return 0;表示程式正常結束並返回。

有關c++中運算順序的問題

16樓:匿名使用者

(1)b+=b b=6

(2)b*=8 b=48

(3)b-=b b=0

(4)c=b c=0

c++,關於先增後增的問題。與運算順序相關

17樓:

建議你不要糾結這東西,編譯器不同結果就可能不同。我的編譯器對a是這麼算的:先算(i++)+(++i)放在一個臨時變數中,結果是3+3=6;然後計算最後一個++i結果是4並與臨時變數中的6加起來是10,把10賦給a。

結束運算後再計算第一個i++,結果i為5。所以最後輸出:5↙10。

第二個表示式被解釋為b=(i++)+[(++i)++]+i;,所以與a=(i++)+(++i)+(++i);不一樣。為什麼這麼解釋?因為c/c++在判斷表示式時遵守所謂「貪心」演算法,即從左至右一次解釋最多的運算子號……

c 程式設計關於cout輸出

include int m 3 const int n 5 void fun int a 0 void main void fun 這是逗號運算子的問題,在c c 中,逗號運算子都是返回運算子右邊的值,在這個例子中,雖然a 3也執行了,但是你列印的時候只會列印出a b的值,而且是a沒有自加之前的值。...

c關於運算子優先順序,c中的運算子優先順序順序是什麼

因為 只是在這copy條語句結束後才 1,假設a 0,則a a 等同於0 0,當然是錯的了,但是現在a的值變為1 補充一點,c 不提倡在同一語句當中多次修改同一個變數的值,樓主知道怎麼回事就行了,有些跟編譯器有關 後置自加是 先取值,變數才加 所以a a 中,大於運算子比較的是相同的值。a a 等價...

關於c 中的運算,C 中的 運算子是什麼意思,請舉例

是異或符號,交換作用的語句是a a b b b a a a b 第一句以後a的值為a b,當b a的時候相當於b a b b b a,因為異或的性質所以b b a a,所以b就等於了a,然後a b就相當於a b a b,這樣a,b的值就交換了 按位異或 運算 xor 000010 100010 10...