下面這個C語言程式直接用變數運算就不能發生交換,而用指標的引用運算為什麼能

2021-04-21 01:33:41 字數 1562 閱讀 4720

1樓:飛火凌峰

這個計算順序與編復譯器的實

制現有關,我用

bai g++ 得到的結果是 2,1。

編譯出的程式

du的計算順序大

zhi致是這樣的:從dao左往右,先計算 *p,得 1,放入暫存器,然後(略)。

用不用指標都是一樣的,*q=*p+(*p=*q)-*q; 能交換的話,b=a+(a=b)-b; 也可以。

2樓:

一、c語言裡沒有bai引用du這種型別。

二、c語言裡zhi將實參傳給函式形dao參時都是版拷貝,「傳指標就能發權

生交換」純屬理解上的誤會:傳指標,交換指標是白搭,因為指標仍然是拷貝,函式退出後前功盡棄;只有通過指標來交換指標指向的目標才能達到永久性生效的目的。假設二數的指標是p、q,交換*p、*q才能永久生效,交換p、q無效。

三、c++裡有引用型別,它只是提供了一種「寫法上的方便」,實質還是傳指標、操作指標指向的目標。

四、在主函式裡,無論用什麼方法交換變數值,都是永久生效的,不存在用指標和引用就能交換而用變數則不能交換的情況。

3樓:匿名使用者

執行後括號外第乙個*p的值為2,還有直接在主函式裡寫b=a+(a=b)-b也能交換,只是將b=a+(a=b)-b寫在函式裡再呼叫才不會交換

4樓:匿名使用者

^經過驗證來,結果都是:2,2

(*p=*q)執行後源,*p就是2,不是1交換應該bai是:du

方法zhi1: a=a+b; b=a-b; a=a-b; 或dao *p=*p+*q; *q=*p-*q; *p=*p-*q;

方法2: a^=b; b^=a; a^=b; 或 *p^=*q; *q^=*p; *p^=*q;

方法3: int t=a; a=b; b=t; 或 int t=*p; *p=*q; *q=t;

5樓:種燒餅的怪叔叔

寫這種來式子完全沒意義,對於乙個自語句,編譯器完全bai沒有義務保證你du

的求值順序。一zhi個式子如果對乙個變數多dao次引用,則必須保證他沒有***。式子b=a+(a=b)-b中對a兩次求值,分別是,計算a和計算a=b,因為他們處在同乙個順序點,無法保證程式先對那個求值,如果先對a求值就是

1+2-2,如果先對a=b求值,就是2+2-2,問題就在於,求值順序完全無法保證,所以不要再寫這種沒有意義的式子了。

6樓:匿名使用者

搞不清楚你的意思 *q=*p+(*p=*q)-*q; 和 b=a+(a=b)-b 是操作是等價的,輸出的結果都是 2 ,2,這沒什麼好疑惑的。

7樓:琦玉

指標,引用都是對資料位址的操作,建議再把這方面知識好好鞏固一下

這個c語言程式為什麼不能交換a,b的值?

8樓:真忙得很

int p;

p = *p1;

*p1 = *p2;

*p2 = p;

指標的運算要加上*,不然就是位址了

c語言程式下面的程式能用嗎

肯定不能用,因為boy類和girl類都沒定義,而且這不過只是乙個方法。學了物件導向程式設計就知道。當時如果做適當的補充,例如定義boy類和girl類,並且建立乙個包含result類的方法,也許可以用來測試boy和girl的結果。這個方法也可以用語言解釋出來 即裡面的演算法 例如第一句 if boy....

c語言程式解析,請問這個c語言程式函式如何解讀?

你的意思是讀一段程式知道它什麼意思嗎?那就照它規則讀嘍。不明白你說的意思!int a 100 定義int型變數a,初始化為100.int 1 100是錯誤的,應該是手誤吧。if a 100 printf d a 100 如果a 100,那麼輸出a 100這個表示式的值,然後換行。else print...

c語言我為什麼不能直接用把字元變數的值賦值給另一

沒問bai題啊du zhigcc和daovs2015都沒問題回 答 include intmain int argc,char argv 因為巨集是乙個 簡單替換,所以c語言中用巨集定義乙個字元常量 乙個字母 可以賦值回給字元變數答。實質是在編譯之前會把巨集替換掉,然後再編譯。例如 define a...