苏丛 发表于 2018-5-13 10:53:48

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?


求大佬解答
求大神教我

ba21 发表于 2018-5-13 11:12:49

苏丛 发表于 2018-5-13 11:17:57

本帖最后由 苏丛 于 2018-5-13 11:27 编辑

ba21 发表于 2018-5-13 11:12


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

电子工业出版社的《C++程序设计基础》这样写的

ba21 发表于 2018-5-13 11:32:30

cout 用了有问 题就不要用咯。


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

cnkizy 发表于 2018-5-13 12:26:55

本帖最后由 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
}

<(¥_$)> 发表于 2018-5-13 15:39:26

很简单,你这程序有个分支没返回值,所以他就拿eax寄存器当返回值了,然后凑巧那个时候eax不为0,所以就以为是成功喽

苏丛 发表于 2018-5-13 16:03:09

ba21 发表于 2018-5-13 11:32
cout 用了有问 题就不要用咯。




这样也是有问题的
这是一个递归,这样改的话第二次或第三次才输对的话返回的都是0

苏丛 发表于 2018-5-13 16:08:39

cnkizy 发表于 2018-5-13 12:26
来自大神的抓狂

大神为何抓狂{:10_277:}

苏丛 发表于 2018-5-13 16:35:27

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

谢谢你,我的两个问题都解决了。
但又有一些问题:
原来运行无误的代码中,如果三次都输错的话,第三次会返回给上一轮递归0,而上一轮递归的返回给上上一轮递归的值应该是多少?
为什么最终返回给main函数的是0?

<(¥_$)> 发表于 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; // 所有分支都要返回值,别让程序不可控
}

cnkizy 发表于 2018-5-13 17:13:51

苏丛 发表于 2018-5-13 16:08
大神为何抓狂

ba21 大神一直在吐槽 我看不下了,顺带写了。{:10_254:}

cnkizy 发表于 2018-5-13 17:15:59

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

同意。写代码的最高境界就是最少最简洁的代码完成最复杂的功能。

苏丛 发表于 2018-5-13 17:27:10

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

好的,谢谢指点

看来这本书经不起仔细的推敲
我还是赶紧看完他
再仔细看C++ Primer Plus

ba21 发表于 2018-5-13 19:38:01

苏丛 发表于 2018-5-13 11:17
我改了一下,你再看看。
递归我觉得没有问题啊,你看能不能改改



递归我觉得没有问题啊


看清字好吧。我可没说有问题,合理跟有问题差距很大的。
能用迭代的为什么要用递归?也没有说书本上的就一定是正确的道理。

ba21 发表于 2018-5-13 19:38:53

cnkizy 发表于 2018-5-13 17:13
ba21 大神一直在吐槽 我看不下了,顺带写了。

不知道大神你这顺带花了多长时间。

cnkizy 发表于 2018-5-13 22:39:13

ba21 发表于 2018-5-13 19:38
不知道大神你这顺带花了多长时间。

我路过就写了下,也就几分钟。{:10_254:}
页: [1]
查看完整版本: mayday C++变量存储的问题