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

2021-01-07 酷扯兒

本文轉載自【微信公眾號: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位整數所能表示的範圍,從而造成程序運行錯誤。方法二則沒有這個問題,這是一種比較好的方法。

相關焦點

  • C語言中「c=a+b」,這種結構合理嗎?
    c = a+++b; 以下代碼是合法的嗎,咋的一看不禁有這樣的疑問? int a = 5, b = 7, c; c = a+++b; 這個代碼確實不咋符合習慣的寫法,但是不管你相不相信,上面的例子是完全合乎語法的。
  • 圓體英文書法展——圓體字母「B」、「C」寫法
    英文圓體字母「B」、「C」的寫法不盡相同,根據國內的大致有兩種寫法,由於筆者能力有限,僅介紹一種寫法。  圓體大寫字母「B」在第一線下方以交叉線筆畫起筆,再寫形似「3」的筆畫,此處的末尾回購要多進行練習才能達到形象生動的效果。
  • C語言入門
    9、設置編寫代碼的行號:工具——選項——文本編輯器——C/C++命令——顯示欄勾選行號後確定。10、什麼是控制臺程序:通過命令行形式與用戶進行交互就是基本的控制臺程序。例如,windows的cmd.exe。11、#include是c語言的預處理指令,用來引入<stdio.h>系統頭文件。
  • Python 為什麼只需一條語句「a,b=b,a」,就能直接交換兩個變量?
    道理很簡單,如果要交換兩個杯子中所裝的水,自然會需要第三個容器作為中轉。然而,Python 的寫法並不需要藉助中間變量,它的形式就跟前面的解包賦值一樣。正因為這個形式相似,很多人就誤Python 的變量交換操作也是基於解包操作。但是,事實是否如此呢?
  • Python小知識:if-else的多種簡潔寫法
    在Python中一般我們寫判斷語句的格式是這樣的:if condition:    passelse:    pass看著短短的代碼卻佔據來好幾行,我心慌了。於是便搜下if-else簡潔的寫法,結果也是發現新大陸。
  • 【C/C+】10個經典的C語言小程序,小白必看!
    程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。
  • JavaScript速記技巧:向著更清晰的代碼邁進
    藉助速記技巧,不僅可以提升代碼可讀性,還可以編寫更少代碼完成任務。下面是一些JavaScript的速記技巧。//Longhand let a, b, c; a = 5; b = 8; c = 12;//Shorthand
  • 編寫高效的C程序與C代碼優化
    比方說,(a/b)>c可以寫成a>(c*b),條件是我們已經知道b為非負數而且b*c不會超過整型數的取值範圍。如果我們能夠確定其中的一個操作數為unsigned,那麼使用無符號除法將會更好,因為它要比有符號除法快得多。
  • C語言求最大公約數代碼及解析
    a,b的最大公約數記為(a,b),同樣的,a,b,c的最大公約數記為(a,b,c),多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法、短除法、輾轉相除法、更相減損法。問題分析如果有一個自然數a能被自然數b整除,則稱a為b的倍數,b為a的約數。幾個自然數公有的約數,叫做這幾個自然數的公約數。
  • 如何寫出高效優美的單片機C語言代碼?
    程序能跑起來並不見得你的代碼就是很好的c代碼了,衡量代碼的好壞應該從以下幾個方面來看1,代碼穩定,沒有隱患。本文引用地址:http://www.eepw.com.cn/article/201611/319838.htm2,執行效率高。3,可讀性高。4,便於移植。
  • 10個經典的C語言小程序
    程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。程序原始碼:main() { int x,y,z,t; scanf("%d%d%d",&x,&y,&z); if (x>y) /*交換x,y的值*/ if(x>z) /*交換x,z的值*/ if(y>z) /*交換z,y的值*/ printf("small to big: %d %d %d\n
  • 10 個經典的 C 語言小程序
    程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。程序原始碼:main() { int x,y,z,t; scanf("%d%d%d",&x,&y,&z); if (x>y) /*交換x,y的值*/ if(x>z) /*交換x,z的值*/ if(y>z) /*交換z,y的值*/ printf
  • C語言八大排序算法,附動圖和詳細代碼解釋!
    取出當前大頂堆的根節點,將其與序列末尾元素進行交換;(此時:序列末尾的元素為已排序的最大值;由於交換了元素,當前位於根節點的堆並不一定滿足大頂堆的性質)    3. 對交換後的n-1個序列元素進行調整,使其滿足大頂堆的性質;
  • 一直以為自己C學的挺好:直到看了這幾個C代碼,連聲說出「臥槽」
    #include <stdio.h>    long a=10000,b=0,c=10000,d,e,f[10001],g;    void main()    {    for(;b !
  • 10個經典的C語言面試基礎算法及代碼
    */#include <stdio.h>void Reverse();int main(){ printf("Enter a sentence: "); Reverse(); return 0;}void Reverse(){ char c; scanf("%c",&c); if( c !
  • 代碼這樣寫更優雅(Python版)
    點擊文章末尾閱讀原文報名作者微課
  • 寫出高效優美的單片機C語言代碼
    程序能跑起來並不見得你的代碼就是很好的c代碼了,衡量代碼的好壞應該從以下幾個方面來看1,代碼穩定,沒有隱患。對於大部分的編譯器,使用指針比使用數組生成的代碼更短,執行效率更高。但是在Keil中則相反,使用數組比使用的指針生成的代碼更短。
  • 30個神奇的Python技巧,幫你寫出更好的代碼!
    a = b = c = 50print(a,b,c)print(type(a))print(type(b))print(type(c))輸出50 50 50<class 'int'><class 'int'><class 'int'>
  • c語言經典小程序匯總大全
    1.程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x》y則將x與y的值進行交換, 然後再用x與z進行比較,如果x》z則將x與z的值進行交換,這樣能使x最小。 2.程序原始碼: main() { int x,y,z,t; scanf(「%d%d%d」,&x,&y,&z); if (x》y) /*交換x,y的值*/ if(x》z) /*交換x,z的值*/ if(
  • c語言是C語言 C教程語言零基礎教學04:int和float變量的基本使用
    大家好,我是陌塵那麼就直接開始了我們這篇教程學for循環以及冒泡算法我們先來理解一下什麼是「循環」字面意思:但是,C語言的循環和這個有點點不同,c語言中大概就是:重複執行一段特定的代碼。(其實就是類似方程)條件表達式,就是一種條件只要這個條件是真(條件成立)就執行特定代碼等特定代碼執行完才執行末尾的表達式for (int a = 0; a < 100; a++){printf("%d ", a);}這是一個簡單的例子,分析一下首先int a = 0;