C++ 与非常量引用参数交换

C++ 与非常量引用参数交换,c++,swap,C++,Swap,我从类型为“float”的右值获得了类型为“float&”的非常量引用的初始化无效[Error] #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); } #包括 无效掉期(浮动

我从类型为“float”的右值获得了类型为“float&”的非常量引用的初始化无效[Error]

#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);
}
#包括
无效掉期(浮动a、浮动b){
浮动温度=a;
a=b;
b=温度;
}
main()
{
INTA=10,b=5;
掉期((浮动)a,(浮动)b);
printf(“%d%d”,a,b);
}

您正在尝试交换临时对象(由于使用强制转换而创建)。此外,在退出掉期交易后,该交易将被删除。不能使用非常量引用绑定临时对象。因此,这样的呼吁毫无意义。我们完全不清楚为什么要将这两个整数强制转换为浮点,以交换它们。为什么不交换整数呢

编写如下函数

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;
}

必须使用指针(*)获取数组。当只通过时,您必须给出符号(&)。使用以下代码

#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);
}
#包括
无效交换(int*a,int*b){
浮动温度=*a;
*a=*b;
*b=温度;
}
main()
{
INTA=10,b=5;
互换(a&b);
printf(“%d\t%d\n”,a,b);
}

Vlad是正确的,为什么强制转换为
浮点值?对所有值使用
int
。但是,如果您有这样做的理由,您必须在
演员阵容
参考资料
中保持一致:

#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;
}
向函数传递地址时,它必须将
指针
作为参数。因此
无效交换(float*a,…
当您需要
引用变量的地址时(作为
指针传递)
),您使用
操作符
地址。当您处理作为
指针传递的值时,为了对
指针指向的
值进行操作,您必须使用
*
操作符
取消引用
指针。将所有这些放在一起,您就得到了上面的代码。(只需使用
int
:)就更容易了。


C++参考

如果我理解你在评论中想要什么,你想要这样的东西:

#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;
}

<>在C++中,你应该使用<代码> STD::SWIFT/COM>,或者如果你愿意,可以编写自己的模板,它将交换任意两个值。
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;
}
模板
无效掉期(T&a、T&b)
{
温度T=a;
a=b;
b=温度;
}
int main(){
INTA=10,b=5;
掉期(a、b);

std::cout
(float)a
创建一个右值,并且右值不能绑定到左值引用。您需要将
a
b
声明为浮动,以便
交换(a,b)
工作。
main()
需要是
int main()
无效交换(float*a,float*b)
交换((float*)&a,(float*)&b);
在这种情况下,为什么有人会使用
浮点值而不是
int
,我无法理解。我只想使用swap(float,float)因为我还需要交换floattypes@DracudaKid您可能会在C++中超载功能。因此您将拥有两个同名函数。或者可以用与标准函数相同的方式编写模板函数,或者使用标准函数交换本身。在C中,您必须重命名函数之一。它正在工作……但是如果我想要的话,它会是什么样子?使用交换的步骤(浮动&,浮动&)“我很困惑。你不能使用<代码>浮点和<代码>,因为你使用了<代码> >浮标你有<代码>浮点<代码>的地址,它是一个浮点<代码>的<代码>指针。所以你必须使用<代码>浮标*/Cux> @ DavidC.RANKIN:这是C++引用。我第一次迷惑是正确的。你说的是什么?<代码>浮点>代码>?你是说想用C++来编写代码> > Case<代码>,还是用其他的方式来称呼它?或者用其他方式来使用它。谢谢你,本杰明。通过<代码>浮点和<代码>,他表示他想引用一个浮点。C++引用类似于指针,但它更像一个别名。这就是说,引用的用法在语法上与引用的用法相同。它允许您执行类似于
交换(a,b)
的操作,并且它实际上会交换
a
b
的值,而不必进行
交换(&a,&b)
。有关示例,请参阅Vlad答案中的第一个交换实现。
$ ./bin/floatref

510
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;
}