实现交换两个int类型变量的值
解法一、二:swap()函数、变量临时保存
#include <iostream>
using namespace std;
int main() {
int a = 0;
int b = 0;
cin >> a;
cin >> b;
//swap(a,b);
int temp;
if(a,b){
temp=a;
a=b;
b=temp;
}else{
cout<<"请输入整数"<<endl;
}
cout << a << " " << b << endl;
return 0;
}
问题1:int temp能不能定义到if语句内,有什么区别和影响
这是变量的作用域的问题。
将 temp
定义在 if
语句内意味着它的作用域仅限于该 if
语句块内。temp只是用来暂存a变量的值,所有写道if语句里更清晰。
就这道题而言,将 int temp
定义到 if
语句内并不会带来效率上的提升,只可能会降低代码 的可读性和可维护性。
但在更复杂的情况下,频繁地在不同的作用域内创建和销毁变量可能会导致不必要的内存分配和释放,从而降低效率。所以一般写到外面更通用。
问题2:如何判断输入的是否为int变量
int a, b;
cin >> a;
if (cin.fail()) {
cout << "输入错误,请输入整数" << endl;
// 清除错误状态
cin.clear();
// 忽略当前行的剩余输入
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
cin >> b;
if (cin.fail()) {
cout << "输入错误,请输入整数" << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
cin.fail()
cin.fail()
是一个成员函数,用于检查输入流 cin
是否处于失败状态.
当输入操作无法执行时(例如,因为输入的数据类型不匹配),cin
会进入失败状态。
在这种情况下,cin.fail()
会返回 true
。
//定义int类型的数据类型
int aaa;
/*********************************************************
通过标准输入流输入数据,这时候可能输入任何东西
流内的数据可以不是int类型,但是我输入的地方是aaa这个int变量
**********************************************************/
cin>>aaa;
所以这时候就可以通过fail()来判断,输入的数据要存到int变量中是不是符合,不符合fail()就会返回给你不符合(true)。
cin.clear()
cin.clear()
是一个成员函数,用于清除输入流 cin
的错误状态。
当 cin
进入失败状态后,它会保持这种状态,直到调用 cin.clear()
。清除错误状态后,cin
可以再次用于输入操作。
//判断输入数据是否符合变量的类型
if(cin.fail()){}
/*****************************************************
如果fail()触发,这时候整个输入流cin就会变成输入失败状态
*****************************************************/
cin.clear();
//把输入流cin的状态改为正常,才能继续使用cin
cin.ignore()
cin.ignore()
是一个成员函数,用于忽略输入流 cin
中的字符。
这个函数通常用于在输入错误后清除输入缓冲区,以便程序可以继续读取后续的输入。
//判断输入数据是否符合变量的类型
if(cin.fail()){}
/*****************************************************
如果fail()触发,这时候整个输入流cin就会变成输入失败状态
*****************************************************/
//把输入流cin的状态改为正常,才能继续使用cin
cin.clear();
/*****************************************************
只是把输入流的状态改为正常
上一次输入流缓冲区里的数据还没有处理
****************************************************/
//把输入流缓冲区里的数据丢掉,开始新的输入
cin.ignore();
// 忽略直到下一个换行符的所有字符
cin.ignore(numeric_limits<streamsize>::max(), '\n');
第一个参数是要忽略的字符的最大数量,第二个参数是用作停止忽略字符的标志的字符。
最大数量:可以用numeric_limits<streamsize>::max()
表示忽略的最大字符数,这是一个很大的数,实际上表示“忽略尽可能多的字符”
停止忽略字符的标志的字符:就是在输入流中直到遇到什么,才停止忽略这个动作。
#include <iostream>
#include <limits>
using namespace std;
int main() {
int a = 0;
int b = 0;
cin >> a;
cin >> b;
if (cin.fail()) {
cout << "输入错误,请输入整数" << endl;
// 清除错误状态
cin.clear();
// 忽略当前行的剩余输入
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
if (cin.fail()) {
cout << "输入错误,请输入整数" << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
int temp;
if(a,b){
temp=a;
a=b;
b=temp;
}else{
cout<<"请输入整数"<<endl;
}
cout << a << " " << b << endl;
return 0;
}
解法三:不增加新的变量
using namespace std;
int main() {
int a = 0;
int b = 0;
cin >> a;
cin >> b;
//write your code here.......
a = a+b;
b = a-b;
a = a-b;
cout << a << " " << b << endl;
return 0;
}
a = a + b;
这行代码将a
和b
的和赋值给a
。b = a - b;
这行代码实际上是在计算(a + b) - b
,即原始的a
的值,并将其赋值给b
。这样,b
就变成了原来a
的值。a = a - b;
这行代码是在计算(a + b) - (原来的 a)
,即原始的b
的值,并将其赋值给a
。这样,a
就变成了原来b
的值。
还是用变量只是存储数据的媒介的思想来实现