int参数和int¶meter的双参数 这是一本从C++编程、原理和实践中练习出来的问题。书中特意告诉我写这些函数,以理解为什么有些行会导致问题。因此,更改代码不是一个选项
我可以将双变量或双文本作为参数发送给swap_v函数,该函数使用传递值int参数 我无法将双变量或双文本作为参数发送到使用按引用传递int¶meters的swap\r函数。当我使用“按值传递”时,它会起作用 这两行都给出了这3个错误 1-类型为int¬ const qualified的引用不能用类型为double的值初始化 2-引用非常量的初始值必须是左值 3-“void swap\u rint&,int&”:无法将参数1从“double”转换为“int&”int参数和int¶meter的双参数 这是一本从C++编程、原理和实践中练习出来的问题。书中特意告诉我写这些函数,以理解为什么有些行会导致问题。因此,更改代码不是一个选项,c++,pass-by-reference,pass-by-value,C++,Pass By Reference,Pass By Value,我可以将双变量或双文本作为参数发送给swap_v函数,该函数使用传递值int参数 我无法将双变量或双文本作为参数发送到使用按引用传递int¶meters的swap\r函数。当我使用“按值传递”时,它会起作用 这两行都给出了这3个错误 1-类型为int¬ const qualified的引用不能用类型为double的值初始化 2-引用非常量的初始值必须是左值 3-“void swap\u rint&,int&”:无法将参数1从“double”转换为“int&” #include &l
#include <iostream>
void swap_v(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void swap_r(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
/*
int x = 7;
int y = 9;
swap_v(x, y); // Doesnt swap
swap_v(7, 9); // Cant swap literals.
const int cx = 7;
const int cy = 9;
swap_v(cx, cy); // Doesnt swap
swap_v(7.7, 9.9); // Cant swap literals.
double dx = 7.7;
double dy = 9.9;
swap_v(dx, dy); // Doesnt swap
swap_v(7.7, 9.9); // Cant swap literals.
*/
int x = 7;
int y = 9;
swap_r(x, y); // Swaps
// Doesnt compile. You have to pass variables when using pass by reference.
//swap_r(7, 9);
const int cx = 7;
const int cy = 9;
// Doesnt compile. You cant change constant values.
//swap_r(cx, cy);
// Doesnt compile. You have to pass variables when using pass by reference.
//swap_r(7.7, 9.9);
double dx = 7.7;
double dy = 9.9;
// ???
swap_r(dx, dy);
// ???
swap_r(7.7, 9.9);
}
这一行:
swap_r(7.7, 9.9);
无法编译,因为编译器需要一个变量引用,而您向它传递了一个文本,这无法完成。因此出现了错误:
非常量引用的初始值必须是左值
您也不能将双重引用传递给&int引用(&D),因此
swap_r(dx, dy);
将双变量引用传递给int引用参数时,编译失败,错误如下:
int类型的引用¬ const qualified不能用double类型的值初始化
void swap_rint&,int&':无法将参数1从“double”转换为“int”&
这一行:
swap_r(7.7, 9.9);
无法编译,因为编译器需要一个变量引用,而您向它传递了一个文本,这无法完成。因此出现了错误:
非常量引用的初始值必须是左值
您也不能将双重引用传递给&int引用(&D),因此
swap_r(dx, dy);
将双变量引用传递给int引用参数时,编译失败,错误如下:
int类型的引用¬ const qualified不能用double类型的值初始化
void swap_rint&,int&':无法将参数1从“double”转换为“int”&
可以从double得到int,但不能从double得到int
简而言之,这里发生的情况如下:
void foo(int x) {}
double y = 5.0;
foo(y);
y不是int,但是double可以转换成int,所以基本上你没有这个,只是为了说明:
double y = 5.0;
int temp = y;
foo(temp);
将临时int传递给函数。现在,如果函数接受引用,则无法执行此操作
void bar(int& X) {}
bar(5);
因为不能将5绑定到非常量引用。那是什么意思?不能更改5的值。类似地,从上面的double转换得到的int只是临时的,将其作为非常量引用传递是没有意义的。同样,这并不是真正发生的事情,但它说明了问题:
void bar(int& X) {}
double y = 5.0;
int temp = y;
bar(temp);
条形图将修改温度,但这对y没有影响。因为这真的不是转换的工作原理,你没有int temp=y;在代码中,编译器明确禁止您也这样做
double y = 5.0;
bar(y);
PS想想如果这样的事情被允许会有多混乱:
void half(int& x) { x /= 2; }
double x = 3.2;
half(x);
现在x是什么?1.6 ? 1.从double到int的转换不是问题,但是如何获得double呢?显然,如果这样的事情被允许的话,它将导致更多的混乱,而不是帮助
PPS交换不是您应该编写的函数。使用std::swap代替。可以从双精度计数器中获取int,但不能从双精度计数器中获取int&值
简而言之,这里发生的情况如下:
void foo(int x) {}
double y = 5.0;
foo(y);
y不是int,但是double可以转换成int,所以基本上你没有这个,只是为了说明:
double y = 5.0;
int temp = y;
foo(temp);
将临时int传递给函数。现在,如果函数接受引用,则无法执行此操作
void bar(int& X) {}
bar(5);
因为不能将5绑定到非常量引用。那是什么意思?不能更改5的值。类似地,从上面的double转换得到的int只是临时的,将其作为非常量引用传递是没有意义的。同样,这并不是真正发生的事情,但它说明了问题:
void bar(int& X) {}
double y = 5.0;
int temp = y;
bar(temp);
条形图将修改温度,但这对y没有影响。因为这真的不是转换的工作原理,你没有int temp=y;在代码中,编译器明确禁止您也这样做
double y = 5.0;
bar(y);
PS想想如果这样的事情被允许会有多混乱:
void half(int& x) { x /= 2; }
double x = 3.2;
half(x);
现在x是什么?1.6 ? 1.从double到int的转换不是问题,但是如何获得double呢?显然,如果这样的事情被允许的话,它将导致更多的混乱,而不是帮助
PPS交换不是您应该编写的函数。使用std::swap代替。您的代码有几个问题。首先,函数void swap_vint a,int b是无用的,因为交换发生在函数范围内,但不会更改函数范围外的值 另一个问题是,函数需要int或int&类型的参数,但传递的却是double。这将编译 但当值转换为int时,它将截断值。您可以重载函数或使用模板:
void swap_v(int a, int b) {...} // Gets called for ints
void swap_v(double a, double b) {...} // Gets called for doubles
template <typename T> void swap_v(T a, T b){...} // Works for all types
您需要将函数的签名更改为void swapconst int&a、const int&b以使其进行编译,但这没有任何意义,因为您不能在函数外部使用传递的值
因此,您的问题的解决方案可能是以下函数:
template <typename T>
void swap(T& a, T& b)
{
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}
您的代码有几个问题。首先,函数void swap_vint a,int b是无用的,因为交换发生在函数范围内,但不会更改函数范围外的值 另一个问题是,函数需要int或int&类型的参数,但传递的却是double。这将进行编译,但会在值转换为int时截断值。您可以重载函数或使用模板:
void swap_v(int a, int b) {...} // Gets called for ints
void swap_v(double a, double b) {...} // Gets called for doubles
template <typename T> void swap_v(T a, T b){...} // Works for all types
您需要将函数的签名更改为void swapconst int&a、const int&b以使其进行编译,但这没有任何意义,因为您不能在函数外部使用传递的值
因此,您的问题的解决方案可能是以下函数:
template <typename T>
void swap(T& a, T& b)
{
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}
文字是常量。无论您在哪里看到3.1415,您都希望它的值为3.1415,因此编译器不允许您将其值与其他值交换 const的含义是您指定一个值,例如Pi到3.1415。因此,cx和cy是常量,而不是变量,因此它们的值不能变化 它将不允许您使用double调用swap\r,因为如果不引入违反直觉的行为,它将无法这样做。假设它将dx转换为值为7的int,dy转换为值为9的int,交换它们,然后将它们转换回double。与其让dx包含9.9,dy包含7.7,不如让它们包含9和7,这不是一个通情达理的人所期望的
该语言确实允许通过将双精度数转换为临时常量整数来交换v。这些常量可以通过值作为int传递,但不能通过引用作为变量传递,因为它们会在语句末尾消失,这是违反直觉的。换句话说,您不希望swap什么也不做,因为编译器会扔掉它从变量中创建的临时值。文本是常量。无论您在哪里看到3.1415,您都希望它的值为3.1415,因此编译器不允许您将其值与其他值交换 const的含义是您指定一个值,例如Pi到3.1415。因此,cx和cy是常量,而不是变量,因此它们的值不能变化 它将不允许您使用double调用swap\r,因为如果不引入违反直觉的行为,它将无法这样做。假设它将dx转换为值为7的int,dy转换为值为9的int,交换它们,然后将它们转换回double。与其让dx包含9.9,dy包含7.7,不如让它们包含9和7,这不是一个通情达理的人所期望的
该语言确实允许通过将双精度数转换为临时常量整数来交换v。这些常量可以通过值作为int传递,但不能通过引用作为变量传递,因为它们会在语句末尾消失,这是违反直觉的。换句话说,您不希望swap什么都不做,因为编译器会扔掉它从变量中创建的临时值。我无法将双变量或双文本作为参数发送给swap\r函数,该函数使用按引用传递int¶meters。为什么因为双是不是int。@火焰是用它的传递值来工作的。@ BLASE也,C++有不安全的/缩小的转换。当你通过值时,有一个隐式的转换。它不能在引用中这样做。int&必须指int,而不是double。您试图在代码中执行的操作类似于在需要int指针的位置传递double的地址,这只会导致在使用double的任何地方都出现未定义的行为。引用更安全一点,您只会得到这个编译时错误。我无法将双变量或双文本作为参数发送到使用pass-by-reference int¶meters的swap\r函数。为什么因为双是不是int。@火焰是用它的传递值来工作的。@ BLASE也,C++有不安全的/缩小的转换。当你通过值时,有一个隐式的转换。它不能在引用中这样做。int&必须指int,而不是double。您试图在代码中执行的操作类似于在需要int指针的位置传递double的地址,这只会导致在使用double的任何地方都出现未定义的行为。引用更安全一点,只会出现编译时错误。我使用这些交换方法是因为书中要求我练习。谢谢你的回答。我使用这些交换方法是因为这本书要求我练习。谢谢你的回答。