c++ While循环无限循环当我把cout语句放进去的时候[closed]

zqdjd7g9  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(137)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答案。

这个问题是由一个打字错误或一个无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
我试着用这个函数来测试一个布尔数组在用户选择的坐标上是否为真。当它为真时,它会一遍又一遍地运行while循环,直到最后输入一个以前没有用过的坐标。
如果没有cout语句,它可以正常工作,但每当我在while循环中放入cout语句时,它就会无限地运行cout语句,而不允许我输入新的坐标。

int const  ROW = 4;
int const  COL = 4;

void confirm(bool mask_array[ROW][COL],int &input1,int &input2);

int main() {
  
  int row;
  int coll;
  bool mask[ROW][COL] = {
    {true,true,true,true},
    {true,true,true,true},
    {true,true,true,true},
    {true,true,true,true}
  };

  cout << "enter row: ";
    cin >> row;
    cout << "enter column: ";
    cin >> coll;

  confirm(mask, row, coll);  
}

void confirm(bool mask_array[ROW][COL],int &input1,int &input2) {
  while (mask_array[input1][input2] == true )
    cout << "enter again" << endl;
    cin >> input1;
    cin >> input2; 
}
insrf1ej

insrf1ej1#

while循环只会执行一个语句,除非你用大括号{ }组成一个复合语句。cin语句在它的外部。

while (mask_array[input1][input2] == true )
  {
    cout << "enter again" << endl;
    cin >> input1;
    cin >> input2;
  }
vof42yt1

vof42yt12#

只要mask_array[input1][input2]中的内容没有被转换为布尔值false,下面循环中的条件就是true

while (mask_array[input1][input2] == true) cout << "enter again" << endl;

0的值会转换为false,其他值则为true
下面几行的缩进无关紧要。C++编译器不关心缩进。它将执行条件后面的语句。

// this is what you check:

while (mask_array[input1][input2] == true ) cout << "enter again" << endl;

// not in the loop:
    cin >> input1;
    cin >> input2;

while ( condition ) statement中,* 复合语句 * 必须用花括号括起来,就像while ( condition ) { /* do stuff */ }一样。只要condition是(转换成)true,花括号内的所有内容都会被重复执行。
要使其成为正确的"检查并重试"循环,请执行以下操作:

for(unsigned y = 0; y < ROW; ++y) {
    for(unsigned x = 0; x < COL; ++x) {
        while ( !(std::cin >> mask_array[y][x]) ) {
            std::cout << "enter again\n";
        }
    }
}

在这种情况下,您可以使用类似下面的helper函数:

int int_value_prompt(const char *prompt) {
    int value;
    std::cout << prompt;
    while(!(std::cin >> value)) { // check if the extraction succeeded
        if(std::cin.eof()) throw std::runtime_error("bye bye");
        std::cin.clear();  // clear error state
        std::cin.ignore(); // drop a char
        std::cout << "try again\n" << prompt;
    }
    return value;
}

相关问题