mayday C++变量存储的问题
本帖最后由 苏丛 于 2018-5-13 16:37 编辑题目是这样的:测试密码输入,用静态变量记录输入密码的次数,若连续3次出入错误,显示错误信息并结束程序。
#include<iostream>
using namespace std;
int password(const int & key);
int main(){
if(password(123456)) {//123456是正确的密码
cout<<"Welcome!"<<endl;
}
else cout<<"Sorry, you are wrong!"<<endl;
}
int password(const int & key){
static int n = 0;
int k;
cout<<"Please input your password";
cin>>k;
n++;
if(n < 3)
if(k == key) {
return 1;
}
else password(key);
else
if(k != key) return 0;
}
我的问题是:
1. 如果第3次才输对的话,返回什么的值是什么?
2. 为什么我在测试的时候把函数改成这样(最后多了一行代码)
int password(const int & key){
static int n = 0;
int k;
cout<<"Please input your password";
cin>>k;
n++;
if(n < 3)
if(k == key) {
return 1;
}
else password(key);
else
if(k != key) return 0;
cout<<"test";
}
输错3次也是“welcome”?
3.
如果3次都输错的话,为什么返回给main函数的是0?
求大佬解答
求大神教我
本帖最后由 苏丛 于 2018-5-13 11:27 编辑
ba21 发表于 2018-5-13 11:12
我改了一下,你再看看。
递归我觉得没有问题啊,你看能不能改改
电子工业出版社的《C++程序设计基础》这样写的 cout 用了有问 题就不要用咯。
要不就
cout<<"test"<< endl;
return 0;
本帖最后由 cnkizy 于 2018-5-13 12:35 编辑
{:10_243:} 来自大神的抓狂
int password(const int & key);
int main() {
if (password(123456)) {//123456是正确的密码
cout << "\nWelcome!\n" << endl;
}
else cout << "\nSorry, you are wrong!\n" << endl;
getch();
return 0;
}
int n = 0;//密码输入次数
int password(const int & key) {
int ipt_key;
cout << "Please input your password:";
cin >> ipt_key;
cout << "\n";
n++;
if (n < 3)
//密码输入次数小于3
if (ipt_key == key) {
return 1;//True
}
else password(key);
else
//密码输入次数大于等于3
if (ipt_key != key) return 0;//False
}
很简单,你这程序有个分支没返回值,所以他就拿eax寄存器当返回值了,然后凑巧那个时候eax不为0,所以就以为是成功喽 ba21 发表于 2018-5-13 11:32
cout 用了有问 题就不要用咯。
这样也是有问题的
这是一个递归,这样改的话第二次或第三次才输对的话返回的都是0 cnkizy 发表于 2018-5-13 12:26
来自大神的抓狂
大神为何抓狂{:10_277:} <(¥_$)> 发表于 2018-5-13 15:39
很简单,你这程序有个分支没返回值,所以他就拿eax寄存器当返回值了,然后凑巧那个时候eax不为0,所以就以 ...
谢谢你,我的两个问题都解决了。
但又有一些问题:
原来运行无误的代码中,如果三次都输错的话,第三次会返回给上一轮递归0,而上一轮递归的返回给上上一轮递归的值应该是多少?
为什么最终返回给main函数的是0?
苏丛 发表于 2018-5-13 16:35
谢谢你,我的两个问题都解决了。
但又有一些问题:
原来运行无误的代码中,如果三次都输错的话,第三次 ...
int password(const int & key){
static int n = 0;
int k;
cout<<"Please input your password";
cin>>k;
n++;
if(n < 3)
if(k == key) {
return 1;
}
else password(key);
else
if(k != key) return 0;
cout<<"test"; // 以x86为例,没return的都会走到这里,然后寄存器eax就是cout<<"test"的返回值,然后这个eax就当成password的返回值了
}
没必要纠结这种问题,还不如把代码改的没有歧义
#include<iostream>
using namespace std;
int password(const int & key);
int main() {
if (password(123456)) {//123456是正确的密码
cout<<"Welcome!"<<endl;
} else {
cout<<"Sorry, you are wrong!"<<endl;
}
return 0; // 加个返回值
}
int password(const int & key) {
static int n = 0;
int k;
if (n++ < 3) {
cout << "Please input your password";
cin >> k;
cout << n << endl;
if(k == key) {
return 1;
} else {
return password(key);
}
}
return 0; // 所有分支都要返回值,别让程序不可控
} 苏丛 发表于 2018-5-13 16:08
大神为何抓狂
ba21 大神一直在吐槽 我看不下了,顺带写了。{:10_254:} <(¥_$)> 发表于 2018-5-13 17:01
没必要纠结这种问题,还不如把代码改的没有歧义
同意。写代码的最高境界就是最少最简洁的代码完成最复杂的功能。 <(¥_$)> 发表于 2018-5-13 17:01
没必要纠结这种问题,还不如把代码改的没有歧义
好的,谢谢指点
看来这本书经不起仔细的推敲
我还是赶紧看完他
再仔细看C++ Primer Plus 苏丛 发表于 2018-5-13 11:17
我改了一下,你再看看。
递归我觉得没有问题啊,你看能不能改改
递归我觉得没有问题啊
看清字好吧。我可没说有问题,合理跟有问题差距很大的。
能用迭代的为什么要用递归?也没有说书本上的就一定是正确的道理。 cnkizy 发表于 2018-5-13 17:13
ba21 大神一直在吐槽 我看不下了,顺带写了。
不知道大神你这顺带花了多长时间。 ba21 发表于 2018-5-13 19:38
不知道大神你这顺带花了多长时间。
我路过就写了下,也就几分钟。{:10_254:}
页:
[1]