C++在两个不同的条件下执行/while循环

C++ do/while loop with two different conditions

本文关键字:条件下 执行 循环 while 两个 C++      更新时间:2023-10-16

我希望do while循环检查输入的输入是R还是p。我认为它正在检查两者,当我运行到那个部分时,它会暂停一分钟,然后我得到"超过CPU限制(已转储内核(。另一个相关的问题是,我有摔坏东西的危险吗?

/************************************************/
/* Name: servcode                               */
/* Description: Get service type                */
/* Parameters: N/A                              */
/* Return Value: servcode                       */
/************************************************/
char servcode()
{
  char servcode = 'a';   // Define variable for service code
  char serviceyn = 'n';  // Define variable for user verify
  int i = 1;             // Define variable 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;
}

正确的语法是:

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

注意扩展的比较和末尾分号的删除:

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

更改:

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

至:

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

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

您需要这样做:

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

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

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

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

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

应为:

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

感谢PaulR的纠正。我的大脑不正常。

让我们分解一下这个语句,看看它在做什么。我加了一些标点符号,但不会改变陈述的意思。

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

逗号运算符分隔两个不同的表达式,并返回第二个表达式的值。第一部分可能会达到你的预期,但第二部分只是一个字面字符"P",这总是正确的!

语句末尾的分号标记将作为while循环执行的内容的正文。这是一个什么都不做,不会改变servcodei的值,所以很明显,一旦你进入循环,你就永远不会离开它。这是一种常见的错误。