C代碼交換a、b值不一樣的寫法

2021-01-12 酷扯兒

本文轉載自【微信公眾號:strongerHuang,ID:strongerHuang】經微信公眾號授權轉載,如需轉載與原文作者聯繫

交換a、b的值在C語言的學習中是很常見的問題。最常用的方法就是引入一個中間變量當作中間介質來交換a、b的值。

代碼如下:

void change_ab(int *a, int *b){int temp = 0; temp = *a; *a = *b; *b = temp;}

注意,不能寫為如下代碼:

void change_ab(int a, int b){int temp = 0; temp = a; a = b; b = temp;}

普通的變量傳遞,則不會改變內存內容,以為普通變量作為參數時,其實是在內存塊(棧空間)中新申請了一塊空閒塊,不是原來的內存塊,而函數調用完畢之後,這塊新申請的內存塊會由於變量的作用域失效而被系統回收。

如果把指針作為實參進行傳遞,也就是把內存地址傳了過去,那麼操作這個指針所指向的內存塊,必然會改變這個內存的內容了。

以上這種方法就是最常見的方法。那麼,你知道如何將a、b的值進行交換,並且不使用任何其他的中間變量?

方法一:採用算術的方法

void change_ab(int *a, int *b){*a = *a + *b; *b = *a - *b; *a = *a - *b;}

方法二:採用異或的方法

void change_ab(int *a, int *b){*a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b;}

方法一存在一個潛在的危險,當形參的類型改為無符號16位時,若a、b的值很大,那麼a+b的值就有可能超出16位整數所能表示的範圍,從而造成程序運行錯誤。方法二則沒有這個問題,這是一種比較好的方法。

相關焦點

  • JavaScript速記技巧:向著更清晰的代碼邁進
    //Longhand let a, b, c; a = 5; b = 8; c = 12;//Shorthand let [a, b, c] = [5, 8, 12];3.三元運算符使用三元運算符(條件),五行代碼可以簡化為一行。
  • C語言編程規範 clean code
    規則4.1 禁止頭文件循環依賴頭文件循環依賴,指 a.h 包含 b.h,b.h 包含 c.h,c.h 包含 a.h, 導致任何一個頭文件修改,都導致所有包含了a.h/b.h/c.h的代碼全部重新編譯一遍。而如果是單向依賴,如a.h包含b.h,b.h包含c.h,而c.h不包含任何頭文件,則修改a.h不會導致包含了b.h/c.h的原始碼重新編譯。
  • 《怪物火車》獄魔全神器代碼一覽
    《怪物火車》中最高難度是契約25難度,有些玩家實在打不過去就會求助於代碼,代碼確實有用,但不要過於依賴,本文作為分享貼,整理了獄魔全神器的代碼,有需要的玩家就來看看吧!《怪物火車》獄魔全神器代碼一覽死者骨灰 {"relicDataID":"9e0deb69-6196-44a6-8220-85bd0df25f77"},勝者桂冠 {"relicDataID":"4190af4b-a32f-42ab-acda-8f0d4f50c3a5
  • C Primer Plus 中文版 PDF
    首先基礎內容非常詳實,c語言的語法規則是比較精煉短小的,而這本書除了精講語法內容,還配有大量的代碼示例和代碼講解,這對於小白來說,是非常重要的。如果一上來就講內容,沒有多少代碼,小白可能根本就不知道怎麼寫代碼。代碼這種東西我覺得跟寫文章類似,剛開始要去模仿,熟練之後自然而言就可以自己創作了。
  • 口袋妖怪火紅金手指代碼大全
    下面是具體的金手指代碼。 開始界面   HP: 0202423c:03e7   攻擊: 0202423e:03e7   防禦: 02024240:03e7   特攻: 02024242:03e7   特防: 02024244:03e7   敏捷: 02024246:03e7   第一招的PP:02023B68
  • Google I/O 2019 Android 應用原始碼現已發布
    更多內容,請閱讀《手勢導航: 實現邊到邊的全屏體驗》系列連載,或請前往 Github 查看團隊在 Google I/O 應用庫中提交的相關代碼,了解如何將應用內容擴展到屏幕邊緣。v=OCHEjeLC_UYhttps://github.com/google/iosched/commit/c635ca7abaf4bea91643a5568e360d227d459f94https://github.com/google/iosched/commit/317e0f98020ce10507cb3c6594c2133e139c4277https://github.com/google/
  • 全自動洗衣機特殊代碼解析A、B、C、D
    全自動洗衣機的故障代碼並不是以E和F為全面覆蓋。也有一些特殊的代碼顯示。比如字母ABCDEFG。這些當中顯示任何一個代碼都是故障的顯示。每一個代碼所代表的故障部位也是不相同的。下面我們就來介紹一下這些代碼所代表的故障部位以及解決辦法。代碼A、進水超過一小時報警。
  • 口袋妖怪漆黑的魅影金手指代碼大全
    部分玩家可能覺得遊戲難度有點大,下面小編就給大家帶來口袋妖怪漆黑的魅影金手指代碼大全,有了金手指玩家就可以輕鬆收集神獸了,不過小編還是要說一句,過度使用金手指會影響遊戲樂趣,請玩家慎用。  喜歡本作的玩家歡迎下載口袋妖怪漆黑的魅影5.0!
  • c語言程序設計是什麼概念?及其作用與產生原因
    c語言程序設計什麼是c語言程序設計?它的作用是什麼?因為什麼而產生?首先,c語言是一門計算機高級語言,就是除了0011101這樣的二進位代碼這些基本語言外。比如:# include <stdio.h>int main(void){int a[5] = {1, 2, 3, 4, 5};int b[5];int
  • Excel用VBA代碼一鍵合併匯總多個工作簿,省時省力必學!
    今天將大家用VBA一鍵合併,只需要幾秒種,為了測試這段代碼,我們新建了4個工作簿在文件夾中,數據都是模擬的,做試驗一鍵合併代碼操作如下所示:我們看原始表格數據,其中,第1個工作簿有點特殊,這個工作簿中,有兩個工作表,第1個工作表的內容是:第2個工作表的內容是:第2,3,4個工作簿中都是僅有
  • C語言經典算法之中序式轉後序式
    新手上路,多多關注,這真的對我很重要說明平常所使用的運算式,主要是將運算元放在運算子的兩旁,例如a+b/d這樣的式子,這稱 之為中序(Infix)表示式,對於人類來說,這樣的式子很容易理 解,但由於電腦執行指令時是 有順序的
  • Python一行代碼就能做成的事情,你會嗎?——智圭谷
    來源:書聲琅琅教育旗下IT培訓品牌智圭谷 Python素以簡潔、多功能著稱,很多功能在用其他程式語言來實現的時候往往需要較長篇幅,代碼數量多且長,但用Python來實現的話,僅僅需要1行代碼即可。
  • 《上古捲軸5》永久buff代碼是什麼 永久buff代碼匯總分享
    > player.addspell 04024821 定身符文 player.addspell 0401eec6 黑市 player.addspell 0401ff21 密僕 player.addspell 04029f12 吟遊詩人的知識 player.addspell 0403b00d
  • 口袋妖怪漆黑的魅影代碼大全 穿牆買物品不用愁
    而這次小編要介紹的就是口袋妖怪漆黑的魅影,在遊戲中你可以通過輸入各種各樣的代碼來獲得一些你需要的東西,來幫助你完成遊戲。所以小編特意整理了一套完整的口袋妖怪漆黑的魅影代碼大全。 >   02024A6E:da   02026D82:63   02026D83:08   02026E28:02   02026E29:03   全家具   02028134:04030201   02028138:08070605   0202813C:0b0a0009
  • 三角洲特種部隊5秘籍分享 黑鷹墜落秘籍代碼一覽
    本篇帶來三角洲特種部隊5秘籍分享,一起來看看黑鷹墜落秘籍代碼有哪些吧!   下載推薦〉〉三角洲特種部隊5黑鷹墜落中文破解版 Ammunition(重裝彈藥)   3cfe170c - Infinite Ammunition(無限彈藥)   91d428aa - Get Megahp(超級HP值[不死])   43b24753 - Invisible(隱形)   drury - 彈藥全滿   kariya - 彈藥無限   roy - 無敵模式
  • 知識分享:C 語言函數指針之回調函數
    我的理解是:把一段可執行的代碼像參數傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被調用執行,這就叫做回調。 如果代碼立即被執行就稱為同步回調,如果過後再執行,則稱之為異步回調。 回調函數就是一個通過函數指針調用的函數。
  • 向量m=(c-a,sinB),n=(b-a,sinA+sinC)求sinA?四個常用重要知識點
    原題原題:△ABC的內角A,B,C的對邊分別為a,b,c,已知向量m=(c-a,sinB),n=(b-a,sinA+sinC),且m∥n。因為已知中給出向量m=(c-a,sinB),n=(b-a,sinA+sinC),且m∥n,所以有(c-a)(sinA+sinC)-(b-a)sinB=0.
  • 《天國拯救》控制臺MOD使用教程秘籍代碼大全
    代碼英文名官方中文Bastardsword變種劍033fc7b6-17b6-486d-95cb-a22afb131be2Guisarme長鉤刀04c2c966-f55b-4afe-b0c2-bfdf4ba0deebSkalitzshield斯卡裡茨之盾0ad36c8c-cfc7-44ab-8e8f-fe85e7646b71Ceremonialmace儀仗0eb0ac15-f0d9-49ce
  • 上古捲軸5控制臺代碼指令合集(16)
    上古捲軸5控制臺代碼指令合集(16) 發布時間:2013/04/13 12:12:25
  • 二次函數圖像和性質與係數a、b、c間的關係,特殊值、對稱軸應用
    1.(4分)如圖,已知二次函數y=ax2+bx+c的圖象與x軸分別交於A、B兩點,與y軸交於C點,OA=OC.則由拋物線的特徵寫出如下結論:①abc>0;②4ac﹣b2>0;③a﹣b+c>0;④ac+b+1=0.