2014-12-06 55 views
2

我[錯誤]從類型「浮動」交換與非const引用參數

#include <stdio.h> 
void swap(float &a, float &b){ 
    float temp=a; 
    a=b; 
    b=temp; 
} 
main() 
{ 
    int a=10, b=5; 
    swap((float)a, (float)b); 
    printf("%d%d",a,b); 
} 
+0

'(浮點)A'創建一個右值,和一個右值不能結合到左值參考。您需要將'a'和'b'聲明爲浮點,以便'swap(a,b)'工作。 – cdhowie 2014-12-06 06:06:47

+1

'main()'需要'int main()'。 – 2014-12-06 06:10:47

+0

'無效互換(浮動*一,浮動* B)''交換((浮動*)&A,(浮動*)&b);'爲什麼有人會使用'float',而不是在這種情況下,'int'我是無法理解。 – 2014-12-06 06:14:30

回答

1

Vlad是正確的,爲什麼投到float?所有值均使用int。但是,如果你有一些理由做這樣的說法,你必須在你的castreferences一致:

#include <stdio.h> 

void swap(float *a, float *b){ 
    float temp=*a; 
    *a=*b; 
    *b=temp; 
} 

int main() 
{ 
    int a=10, b=5; 
    swap((float*)&a, (float*)&b); 
    printf("\n%d%d\n\n",a,b); 
    return 0; 
} 

輸出:

$ ./bin/floatcast 

510 

當你傳遞一個地址給一個函數,它必須以pointer爲參數。因此void swap(float *a,..當您需要一個reference到一個變量的地址(作爲pointer傳遞)時,您可以使用address of運算符&。當您處理作爲pointer傳遞的值時,爲了在pointer指向的values上運行,您必須使用*運算符指示dereference。把所有這些放在一起,你就可以得到你的代碼。 (非常容易,只需使用int ... :)


C++ Refernce

如果我理解您在您的評論想要什麼,你想是這樣的:

#include <iostream> 

// using namespace std; 

void swap(float& a, float& b){ 
    float temp=a; 
    a=b; 
    b=temp; 
} 

int main() 
{ 
    int a=10, b=5; 
    swap ((float&)a, (float&)b); 
    std::cout << std::endl << a << b << std::endl << std::endl; 
    return 0; 
} 

輸出:

$ ./bin/floatref 

510 
+0

它正在工作......但如果我想使用swap(float&,float&),它將如何? <對不起..我的英文不好> – 2014-12-06 06:27:02

+0

我很困惑。你不能使用'float&',因爲在你使用'&'後你不再有'float',你有'float'的地址,它是'float'的指針,所以你必須使用'float *' – 2014-12-06 06:29:09

+0

@ DavidC.Rankin:這是一個C++參考。 – 2014-12-06 06:29:41

1

您正在試圖交換臨時對象的右值的類型「浮動&」的非const引用無效初始化(由於使用鑄造而創建)。此外,退出交換後將被刪除。您不能綁定具有非常量引用的臨時對象。所以在這樣的呼叫中沒有任何意義。完全不清楚你爲什麼試圖將這兩個整數都浮動來交換它們。爲什麼不自己交換整數?

寫像

void swap(int &a, int &b) 
{ 
    int temp = a; 
    a = b; 
    b = temp; 
} 

功能考慮到已經存在的標準功能std::swap

如果你想用C來寫掉函數,那麼它看起來就像

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

我只想用互換(浮動,浮動) ,因爲我還需要換浮點類型 – 2014-12-06 06:18:51

+0

@DracudaKid您可以重載在C++的功能。所以,你將有兩個函數具有相同的名字,或者你可以寫一個模板函數與標準函數相同的方式或使用標準函數swap本身。在C中,你必須重命名其中一個函數。 – 2014-12-06 06:21:54

+0

哦...我明白了......感謝您的幫助:) – 2014-12-06 06:29:13

0

您必須使用指針(*)來獲取數組。雖然只有你必須給予&符號(&)。使用下面的代碼。

#include <stdio.h> 
void swap(int* a, int *b){ 
float temp=*a; 
*a=*b; 
*b=temp; 
} 
main() 
{ 
int a=10, b=5; 
swap(&a, &b); 
printf("%d \t %d\n",a,b); 
} 
+0

我不認爲它的工作原理 – 2014-12-06 06:16:57

+0

對不起。我完成了編輯。 – 2014-12-06 06:18:15

0

在C++中,您應該使用std::swap,或者如果您願意,可以編寫自己的模板來交換任意兩個值。

template <typename T> 
void swap(T & a, T & b) 
{ 
    T temp = a; 
    a = b; 
    b = temp; 
} 

int main() { 
    int a = 10, b = 5; 
    swap(a, b); 
    std::cout << a << " \t " << b << std::endl; 
    return 0; 
} 

你所要完成的(治療intfloat)將會導致不確定的行爲 - 它可能對你的編譯工作,但它可以很容易地在不同的編譯器或結構斷裂。如果您真的需要,您可以使用reinterpret_cast強制執行此行爲。