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