描述
给定三个整数,请将它们按从小到大的顺序输出。
输入
输入为一行,包含三个整数,用空格分隔。
输出
输出为一行,包含三个整数,用空格分隔,表示排序后的结果。
输入样例 1
9 3 7
输出样例 1
3 7 9
代码一(如下):最普通的方法
#include <iostream>
using namespace std;
int main()
{int a, b, c;cin >> a >> b >> c;int t;if (a > b){t = a;a = b;b = t;}if (a > c){t = a;a = c;c = t;}if (b > c){t = b;b = c;c = t;}cout << a << " " << b << " " << c;return 0;
}
代码二(如下):指针法
#include <iostream>
using namespace std;
void exchange(int*, int*);
int main()
{int a, b, c;cin >> a >> b >> c;int* p1 = &a, * p2 = &b, * p3 = &c;if (a > b)exchange(p1, p2);if (a > c)exchange(p1, p3);if (b > c)exchange(p2, p3);cout << a << " " << b << " " << c;return 0;
}
void exchange(int* a, int* b)
{int t = *a;*a = *b;*b = t;
}
代码三(如下):返回值有两个
#include <iostream>
#include <utility>
using namespace std;
pair<int, int>exchange(int a,int b)
{int t = a;a = b;b = t;pair<int, int>result;result = make_pair(a, b);return result;
}
int main()
{int a, b, c;cin >> a >> b >> c;if (a > b){pair<int, int>result = exchange(a, b);a = result.first;b = result.second;}if (a > c){pair<int, int>result = exchange(a, c);a = result.first;c = result.second;}if (b > c){pair<int, int>result = exchange(b, c);b = result.first;c = result.second;}cout << a << " " << b << " " << c;return 0;
}
代码四(如下):引用法
#include <iostream>
using namespace std;
void exchange(int&, int&);
int main()
{int a, b, c;cin >> a >> b >> c;if (a > b)exchange(a, b); //实参为整型变量if (a > c)exchange(a, c);if (b > c)exchange(b, c);cout << a << " " << b << " " << c;return 0;
}
void exchange(int& x, int& y) //形参是“引用”
{int t = x;x = y;y = t;
}
问题点:
①:引用
对一个数据可以建立一个“引用”,它的作用是为一个变量起一个别名。这是C++对C的一个重要扩充。
// 假如有一个变量啊,想给它起一个别名b,可以这样写:
int a; //定义a是整型变量
int &b=a; //声明b是a的“引用”
// 以上声明了b是a的引用,即b是a的别名。经过这样的声明后,使用a或b的作用相同,都代表同一变量。如果a的值是20,则b的值也是20。
&是引用声明符,并不代表地址。不得理解为“把a的值赋给b的地址”。在数据类型名后面出现的&是引用声明符,在其他场合出现的都是地址符。
注意:
1)引用不是一种独立的数据类型。对引用只有声明,没有定义。必须先定义一个变量,然后声明对该变量建立一个引用(别名)。
2)声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量。当引用作为函数形参时不必在声明中初始化,它的初始化是在函数调用时的虚实结合实现的,即作为形参的引用是实参的别名。
3)在声明一个引用后,不能再使之作为另一变量的引用。
4)不能建立引用数组。如:
int a[5];
int &b[5]=a; // 错误,不能建立引用数组
int &b=a[0]; // 错误,不能作为数组元素的别名
5)不能建立引用的引用。也没有引用的指针。
int a=3;
int &b=a; //声明b是a的别名,正确
int &c=b; //试图建立引用的引用,错误
int*p=b; //不能建立指向引用的指针
6)可以取引用的地址。如已声明b是a的引用,则&b就是变量a的地址&a。
int *pt;
pt=&b; //把变量a的地址&a赋给指针变量pt
7)区别引用声明符&和地址运算符&。
int &b=a; //声明b是a的引用
cout<<&b<<endl; //输出b的地址,此处&b不是引用
在声明了引用后,在使用它时不带&,而只用引用的名字(如b,而不是&b)。
关于引用的性质:如果在程序中声明了b是变量a的引用,实际上在内存中为b开辟了一个指针型的存储单元,在其中存放变量a的地址,输出引用b时,就输出b所指向的变量a值,相当于输出*b。引用其实就是一个指针常量,它的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有引用的功能都可以由指针实现。
C++之所以增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能。
以引用作为形参,实参不是地址而是整型变量名,由于形参是引用,系统会自动将实参的地址传递给形参。注意:此时传送的是实参变量的地址而不是实参变量的值。
将变量名作为实参和形参的函数调用 以及 使用指针变量作形参的函数调用(实参是地址,传递的是地址,故仍然是传值方式,不要误以为是传址方式)都是传值方式;以引用作为形参的函数调用(实参是变量名,而传递的是变量的地址)时传址方式。