關於前置 和後置 與 的運算順序?

時間 2021-05-30 00:56:59

1樓:

這裡《其實是cout.operator<<(),過載操作符,或者成員函式。

這兩種呼叫方法,區別在於這個函式的引數是什麼。

++i,拷貝的是++操作符的返回值。

i++,拷貝的是i。

這兩種情況,實際上就是i狀態的不同。

嚴格地來說,從執行時的時序這個角度上說,不見得cout<

稍微展開一些,根據C++ prime這本書呢(以下開始搬運),所謂優先順序,決定的時運算元是怎麼和操作符組合在一起的,優先順序大的操作符先和運算元組合,相當於加個括號。優先順序並不是運算的順序,不是說優先順序大的先計算。實際上大多數操作符並未規定運算元的運算順序。

舉例來說,int i = f1() * f2() + f3().

我們只能說,operator*() 只是說把函式f1 f2的返回值相乘後,再加上f3()的返回值。並沒有說,f1 或者f2,一定比f3先算完,沒準時序上f3先算完。在這個例子裡,如果f3 f2 f1會修改同乙個資源,那麼就undefine了。

然後呢,實際上只有4種操作符規定了計算順序,operator&&(), operator||(),operator?:(),還有operator,()。對於其他的呢,最好還是在寫的時候,不要在操作符計算時假定某種時序。

2樓:

i++的返回值是i的副本。也就是說你可以理解成,在《運算前,i已經變成1了,可是傳遞給《的返回值是比如說其實是乙個tempi,在i自增之前賦值給他了,也就是0,所以輸出還是0。

或者說理解成:

//整個作為乙個++運算,你看在《前面吧

cout<

3樓:北極

inti=

0;//此時 i 值是0

cout

<

endl

;// 這一句展開了就是:

// 表示式的值 = (i++) = 0

// i計算完以後結果是1

// cout得到的值是:

// cout << 表示式的值 << endl;

//所以就是 cout << 0 << endl;cout

<<++i

<

;// 這一句展開了就是:

// 表示式的值 = (++i) = 2

// i計算完以後結果是2

// cout得到的值是:

// cout << 表示式的值 << endl;

//所以就是 count << 2 << endl;所以題主你要區分表示式的值和i的值的區別。cout拿到的都是表示式的值,這個值跟i值不一定是相同的。

VS2008反彙編inti=

0;000C13DE

movdword

ptr[i],

0// 初始化i = 0

cout

<

<

;000

C13E5

moveax

,dword

ptr[i]

000C13E8

movdword

ptr[

ebp-

0D0h

],eax

//取i值,儲存到[ebp-0xD0]裡

000C13EE

movecx

,dword

ptr[i]

//取i值

000C13F1

addecx,1

//加1

000C13F4

movdword

ptr[i],

ecx//儲存i

000C13F7

movesi

,esp

000C13F9

movedx

,dword

ptr[

__imp_std

::endl(0

C8290h

)]000

C13FF

push

edx//endl入棧(傳參)

000C1400

movedi

,esp

000C1402

moveax

,dword

ptr[

ebp-

0D0h

]//[ebp-0xD0]入棧(值是0)

000C1408

push

eax000

C1409

movecx

,dword

ptr[

__imp_std

::cout(0

C8294h

)]//處理運算子<<

000C140F

call

dword

ptr[

__imp_std

::basic_ostream

,std

::char_traits

>>::

operator

<<(0

C829Ch

)]000

C1415

cmpedi

,esp

000C1417

call

@ILT

+325

(__RTC_CheckEsp)(

0C114Ah

)000

C141C

movecx

,eax

//處理運算子<<

000C141E

call

dword

ptr[

__imp_std

::basic_ostream

,std

::char_traits

>>::

operator

<<(0

C8298h

)]000

C1424

cmpesi

,esp

000C1426

call

@ILT

+325

(__RTC_CheckEsp)(

0C114Ah

)cout

<<++i

<

;000

C142B

moveax

,dword

ptr[i]

//取i值

000C142E

addeax,1

//加1

000C1431

movdword

ptr[i],

eax//儲存i值

000C1434

movesi

,esp

000C1436

movecx

,dword

ptr[

__imp_std

::endl(0

C8290h

)]000

C143C

push

ecx//endl入棧

000C143D

movedi

,esp

000C143F

movedx

,dword

ptr[i]

//i值(值是2)入棧

000C1442

push

edx000

C1443

movecx

,dword

ptr[

__imp_std

::cout(0

C8294h

)]000

C1449

call

dword

ptr[

__imp_std

::basic_ostream

,std

::char_traits

>>::

operator

<<(0

C829Ch

)]000

C144F

cmpedi

,esp

000C1451

call

@ILT

+325

(__RTC_CheckEsp)(

0C114Ah

)000

C1456

movecx

,eax

000C1458

call

dword

ptr[

__imp_std

::basic_ostream

,std

::char_traits

>>::

operator

<<(0

C8298h

)]000

C145E

cmpesi

,esp

履帶車輛的主動輪前置與後置有哪些優劣?

yixiang liu 動力艙在哪兒,主動輪就在哪兒唄。根據我的觀察,從前往後駕駛艙 戰鬥艙 動力艙的布局是坦克發展過程中確立的最合理的布局,至於為什麼步兵戰車,比方說05式兩棲動力艙在前面,那是因為它後面是乘員艙啊,還要開門,所以只能放在前面。至於梅卡瓦的前置布局,造成了很多的問題的,世界上除了以...

C語言中的前置 和後置 返回的都是右值嗎?

w2014 以C99為例,並沒有找到直接解釋這個問題的描述。但是在6.5.16 Assignment operators 中有這樣的描述 An assignment operator stores a value in the object designated by the left operan...

背景調查與offer和辭職的先後順序?

八方錦程僱傭風險管理 背景調查 一般是在通過面試後進行,可以是offer前,也可以offer後,有些是入職前做背調,有些特定情況,入職後做背調。而現在大部分企業所強調,一般是入職前背景調查。八方錦程做背景調查12年,遇到不少的情況。比如,候選人通過面試後,與雇主是約定離職時間,仍在前雇主工作,該如何...