鱼C论坛

 找回密码
 立即注册
查看: 2406|回复: 15

[已解决]mayday C++变量存储的问题

[复制链接]
发表于 2018-5-13 10:53:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 苏丛 于 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?
QQ图片20180513163420.jpg

求大佬解答
求大神教我
最佳答案
2018-5-13 17:01:32
苏丛 发表于 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; // 所有分支都要返回值,别让程序不可控
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-13 11:12:49 | 显示全部楼层
2018-05-13_111228.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-5-13 11:17:57 | 显示全部楼层
本帖最后由 苏丛 于 2018-5-13 11:27 编辑


我改了一下,你再看看。
递归我觉得没有问题啊,你看能不能改改

电子工业出版社的《C++程序设计基础》这样写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 11:32:30 | 显示全部楼层
cout 用了有问 题就不要用咯。


要不就
        cout<<"test"<< endl;
        return 0;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 12:26:55 | 显示全部楼层
本帖最后由 cnkizy 于 2018-5-13 12:35 编辑

来自大神的抓狂
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
}
1.png 2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 15:39:26 | 显示全部楼层
很简单,你这程序有个分支没返回值,所以他就拿eax寄存器当返回值了,然后凑巧那个时候eax不为0,所以就以为是成功喽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 16:03:09 | 显示全部楼层
ba21 发表于 2018-5-13 11:32
cout 用了有问 题就不要用咯。

这样也是有问题的
这是一个递归,这样改的话第二次或第三次才输对的话返回的都是0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 16:08:39 | 显示全部楼层
cnkizy 发表于 2018-5-13 12:26
来自大神的抓狂

大神为何抓狂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 16:35:27 | 显示全部楼层
<(¥_$)> 发表于 2018-5-13 15:39
很简单,你这程序有个分支没返回值,所以他就拿eax寄存器当返回值了,然后凑巧那个时候eax不为0,所以就以 ...

谢谢你,我的两个问题都解决了。
但又有一些问题:
原来运行无误的代码中,如果三次都输错的话,第三次会返回给上一轮递归0,而上一轮递归的返回给上上一轮递归的值应该是多少?
为什么最终返回给main函数的是0?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 17:01:32 | 显示全部楼层    本楼为最佳答案   
苏丛 发表于 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; // 所有分支都要返回值,别让程序不可控
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-13 17:13:51 | 显示全部楼层

ba21 大神一直在吐槽 我看不下了,顺带写了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 17:15:59 | 显示全部楼层
<(¥_$)> 发表于 2018-5-13 17:01
没必要纠结这种问题,还不如把代码改的没有歧义

同意。写代码的最高境界就是最少最简洁的代码完成最复杂的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 17:27:10 | 显示全部楼层
<(¥_$)> 发表于 2018-5-13 17:01
没必要纠结这种问题,还不如把代码改的没有歧义

好的,谢谢指点

看来这本书经不起仔细的推敲
我还是赶紧看完他
再仔细看C++ Primer Plus
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 19:38:01 | 显示全部楼层
苏丛 发表于 2018-5-13 11:17
我改了一下,你再看看。
递归我觉得没有问题啊,你看能不能改改

递归我觉得没有问题啊


看清字好吧。我可没说有问题,合理跟有问题差距很大的。
能用迭代的为什么要用递归?也没有说书本上的就一定是正确的道理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 19:38:53 | 显示全部楼层
cnkizy 发表于 2018-5-13 17:13
ba21 大神一直在吐槽 我看不下了,顺带写了。

不知道大神你这顺带花了多长时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 22:39:13 | 显示全部楼层
ba21 发表于 2018-5-13 19:38
不知道大神你这顺带花了多长时间。

我路过就写了下,也就几分钟。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表