Java 方法的參數(shù)是簡單類型的時候,是按值傳遞的 (pass by value),所以Java里面不能實現(xiàn)和C中一樣的swap方法來交換兩個數(shù)的值。非要用的話只能這樣寫:
//交換數(shù)組data中的第a和第b個元素
public static void swap(int[] data, int a, int b) {
int t = data[a];
data[a] = data[b];
data[b] = t;
} 估計不是你想要的效果。
關(guān)于Java中參數(shù)和引用的問題建議看看下面的博文:
/zw_2011/article/details/6431448
將兩個數(shù)進(jìn)行互換的方法有兩種形式:
1、借助中間變量完成,此方法直觀,易理解,使用最多
2、不需要中間變量,通過變量身的運算完成交換。
參考代碼:
方法1:
int a=2,b=3,t;
t=a; //先將a存儲到臨時變量t中
a=b; //將b存儲到a中
b=t; //將臨時變量中的原a值存儲到b中
printf("a=%d b=%d\n", a,b );
方法2:
int a=2,b=3,t;
a += b ; //把兩數(shù)之和存到a中
b= a-b ; //用兩數(shù)和減去b可得原a,存儲到b中
a= a-b ; //因為b現(xiàn)在是原a值,所以,用兩數(shù)和減去b(原a)可得 原b,存儲到a中
此方法,還可以用異或運算來實現(xiàn),原理相同。
編程中有時會需要交換兩個變量的值,之前常用的方法就是利用一個臨時變量作為中間值交換,并且一直受限于現(xiàn)實中兩瓶油交換的思維,認(rèn)為這是唯一的方法,但在編程中真的如此嗎?假設(shè):int a=1;int b=2;現(xiàn)在需要交換兩個int變量的值 1.常用的方法,使用臨時變量:int c = a;a = b;b = c;這是常用的也是最容易想到的方法。
2.運用位運算^:a^=b;b^=a;a^=b;或者a=a^b;b=a^b;a=a^b;我的理解:^即異或操作符,相同為0,不同為1,對于二進(jìn)制有三種形式,即: m=0, n=0; 第一次計算m^n結(jié)果m=0,第二次計算n^=m結(jié)果為0,即是m原來的值。 m=0, n=1; 第一次計算m^n結(jié)果m=1,第二次計算n^=m結(jié)果為0,還是m原來的值。
m=1, n=1; 第一次計算m^n結(jié)果m=0,第二次計算n^=m結(jié)果為1,還是m原來的值。 變量名只是代號,不考慮順序,只有三種形式。
由此得出結(jié)論位m與另一位n進(jìn)行異或運算兩次之后表達(dá)式(m^n)^n的值仍為原來的值,將這個值賦給另一個變量就實現(xiàn)交換。 由于計算機中數(shù)值表示形式為二進(jìn)制,由一位推廣至8、16、32位,結(jié)論不變,因此對于int值來說也實現(xiàn)了交換。
3.運用算術(shù)運算,容易理解,也挺巧妙:a=a+b;b=a-b;//b=(a+b)-b a=a-b;//a=a+b-((a+b)-b) 三種方案第二種最優(yōu),但不太好理解,第三種次之,最容易理解的屬第一種方案,但空間及時間開銷較大。附:異或值表輸入運算符輸入結(jié)果1^011^100^000^11。
#include
#include
#include
int fun1(int *a,int *b)
{
int temp;
if(*a>=*b)
{
temp=*a;
}
else
{
temp=*b;
}
return(temp);
}
int main(void)
{
int a=2;
int b=1;
printf("a=%d,b=%d\n",a,b);
fun2(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
一、線路交換
所謂線路交換是通過網(wǎng)絡(luò)中的節(jié)點在兩個站之間建立一條專用的通訊線路。如圖1的電話系統(tǒng),這種線路交換系統(tǒng),在兩個站之間有一個實際的物理連接,這種連接是節(jié)點之間的連接序列。在傳輸任何數(shù)據(jù)之間都必須建立點到點的線路。如站1發(fā)送一個請求到節(jié)點2,請求與站點2建立一個連接,那么站點1到節(jié)點1是一條專用線路。在交換機上分配一個專用的通道連接到節(jié)點2再到站點2的通訊。至此就建立了一條從站點1經(jīng)過節(jié)點2再到站點2的通訊物理通道。這樣就可以將話音從站點1傳送到站點2了,一般來說這種連接是全雙工的,可以在兩個方向傳輸話音(數(shù)據(jù))。
二、報文交換
這種交換方式不需要在兩個站點之間建立一條專用通路,如果一個站想要向站點2發(fā)送一個報文(信息的一個邏輯單位),它把站點2的地址(編碼方式,叫做地址碼)附加在要發(fā)送的報文上。然后把報文通過網(wǎng)絡(luò)從節(jié)點到節(jié)點進(jìn)行發(fā)送,在每個節(jié)點中(如要通過多個節(jié)點才能發(fā)送到站點2)完整地接收整個報文且暫存這個報文,然后再發(fā)送到下一個節(jié)點。在交換網(wǎng)中,每個節(jié)點是一個電子或機電結(jié)合的交換設(shè)備,每個節(jié)點通常是一臺通用的小型計算機。它具有足夠的存儲容量來緩存進(jìn)入的報文。一個報文在每個節(jié)點的延遲時間等于接收報文的所有位所需要的時間,加上等待時間和重傳到下一節(jié)點所需要的排隊延時時間。
報文交換有以下優(yōu)點
1、線路效率較高,這是因為許多報文可以用分時方式共享一條節(jié)點到節(jié)點的通道。
2、不需要同時使用發(fā)送器和接收器來傳輸數(shù)據(jù),網(wǎng)絡(luò)可以在接收器可用之前暫時存儲這個報文。
3、在線路交換網(wǎng)上,當(dāng)通訊量變得很大時,就不能接受某些呼叫。而在報文交換上卻仍然可以接收報文,只是傳送延遲會增加。
4、報文交換系統(tǒng)可以把一個報文發(fā)送到多個目的地。
5、能夠建立報文的優(yōu)先權(quán)。
6、報文交換網(wǎng)可以進(jìn)行速度和代碼的轉(zhuǎn)換,因為每個站都可以用它特有的數(shù)據(jù)傳輸率連接到其他點,所以兩個不同傳輸率的站也可以連接,另外還可以轉(zhuǎn)換傳輸數(shù)據(jù)的格式。
三、分組交換
分組交換方式兼有報文交換和線路交換的優(yōu)點。其形式上非常像報文交換。主要差別在于分組交換網(wǎng)中要限制傳輸?shù)臄?shù)據(jù)單位長度,一般在報文交換系統(tǒng)中可傳送的報文數(shù)據(jù)位數(shù)可做得很長,而在分組交換中,傳送報文的最大長度是有限制的,如超出某一長度,報文必須要分割成較少的單位,然后依次發(fā)送,我們通常稱這些較少的數(shù)據(jù)單位為分組。這就是報文交換與分組交換所不同之處。
void swap (int &x,int &y){int a; a=x;x=y;y=a;}#include void main(){ int x,y; scanf("%d %d",&x,&y); swap (x,y); printf("%d %d",x,y);}首先,swap函數(shù)在沒有定義返回值類型時,編譯器會默認(rèn)返回int類型,所以加void無返回類型就正確。
其次,樓主的參數(shù)傳遞是值傳遞,不會交換兩個數(shù),參數(shù)可以使用引用傳遞,如我的改動,也可以以指針傳遞;希望對樓主有幫助;。
聲明:本網(wǎng)站尊重并保護(hù)知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時間:2.760秒