C ++ do / while循环有两个不同的条件

时间:2011-10-19 15:24:45

标签: c++

我希望do while循环检查输入的输入是否为R OR P.我认为它正在检查两者以及当我运行它时到达那个部分暂停一个分钟,然后我得到“超过Cpu限制(核心倾销)。在另一个相关的说明,我有破坏的危险吗?

/************************************************/
/* Name: servcode                               */
/* Description: Get service type                */
/* Parameters: N/A                              */
/* Return Value: servcode                       */
/************************************************/

char servcode()
{
  char servcode = 'a';                             //Define var for service code
  char serviceyn = 'n';                            //Define var for user verify
  int i = 1;                                       //Define var for sentinel loop

  do {
    cout << "\n" << "\n" << "Please enter your service code, [R]egular or [P]remium:" << "\n";
    cin >> servcode;
    while ((servcode != 'R', 'P') && (i < 3));
    {
        cout << "\n" << "Error - invalid service code, please try again.";
        cout << "\n" << "Please enter your service code: ";
        cin >> servcode;
        i++;
        if (i == 3)
        {
            cout << "\n" << "Too many invalid attempts, program terminating." << "\n"
             << "Have a nice day. " << "\n" << "\n";
            exit (0);
        }     //end if
    }     //end while
    cout << "\n" << "You entered: " << servcode << "\n"
     << "Is that correct? [y,n]";
    cin >> serviceyn;
  } while (serviceyn != 'y'); // end do/while loop

  return servcode;
}

5 个答案:

答案 0 :(得分:7)

正确的语法是:

while (servcode != 'R' && servcode != 'P' && i < 3)

注意扩展比较和最后删除分号:

  1. (servcode != 'R', 'P')是有效的C ++,但没有做到你期望它做的事情;
  2. 分号使语句成为一个空体的循环,因此它会继续执行,因为循环条件永远不会改变。

答案 1 :(得分:4)

变化:

while ((servcode != 'R', 'P') && (i < 3));

为:

while ((servcode != 'R') && (servcode != 'P') && (i < 3))

请注意删除不需要的分号。

答案 2 :(得分:0)

(servcode != 'R', 'P')

应该是:

(servcode != 'R') && (servcode != 'P')

感谢PaulR的纠正。我的大脑没有装备。

答案 3 :(得分:0)

你需要做这样的事情:

while(something != 'a' && something != 'b')

您正在使用逗号运算符,该运算符会丢弃除最后一个之外的每个表达式的结果,因此:

while(something != 'a', 'b')

somethinga进行比较,忽略结果,并使用'b'作为循环的条件。 'b'是一个非零值,因此它始终为true并且循环继续(或直到内存耗尽,或者其他东西停止它)。

答案 4 :(得分:0)

让我们分解这个陈述,看看它在做什么。我添加了一些不会改变声明含义的额外标点符号。

while (((servcode != 'R'), ('P')) && (i < 3)) { };

逗号运算符分隔两个不同的表达式并返回第二个表达式的值。第一部分可能会达到您的预期,但第二部分只是一个字面上的字符'P',它始终是真的!

语句末尾的分号标记将作为while循环执行的内容。这是一个无所作为,不会改变servcodei的价值,因此很明显,一旦你进入循环,你永远不会离开它。这是一个常见的错误。