C ++ if ... then语句

时间:2011-05-27 21:31:14

标签: c++

所以我正在尝试制作一个简单的应用程序来测试用户。它会询问一个问题并且用户回答1,2,3或4.然后应用程序接受该答案,如果正确,则将total_score添加+1,最后将显示。一切看起来都很合理,但是当我运行它并且我到达if (q1_valid == false)部分时,它会跳过cout并运行goto,无论q1_valid是真还是假。

#include <iostream>

using namespace std;

int main()
{
    int q1_answer;
    int total_score;
    bool q1_correct;
    bool q1_valid;

    Question_1:
    cout << "Question 1 (#3 is correct)" << endl;
    cout << "1.) Answer 1" <<endl;
    cout << "2.) Answer 2" <<endl;
    cout << "3.) Answer 3" <<endl;
    cout << "4.) Answer 4" <<endl;
    cin >> q1_answer;

    if (q1_answer == 1)
    q1_correct = false;
    q1_valid = true;

    if (q1_answer == 2)
    q1_correct = false;
    q1_valid = true;

    if (q1_answer == 3)
    q1_correct = true;
    q1_valid = true;

    if (q1_answer == 4)
    q1_correct = false;
    q1_valid = true;

    if (q1_valid == false)
    cout << "Invalid answer." <<endl;
    goto Question_1;

    if (q1_correct == true)
    cout << "Correct!" <<endl;
    (total_score + 1);
    goto Question_2;

    if (q1_correct == false)
    cout << "Incorrect." <<endl;
    goto Question_2;

    if (q1_valid == false)
    goto Question_1;

    Question_2:
    cout<< "Q2" <<endl;
cin.ignore();
cin.ignore();
}

5 个答案:

答案 0 :(得分:5)

我在这里有一些提示:

  1. 如果......则是条件,而不是循环。对不起,那只是我有点挑剔。 ;)
  2. 永远不会永远使用goto。高级用法:只有在有充分理由的情况下才使用goto。
  3. 测试布尔值时,不需要“== true”或“== false”。
  4. 看起来你还没有学会如何使用else语句。这将使您的程序更容易阅读,调试和理解。
  5. 如上所述,括号也是必要的。

答案 1 :(得分:3)

您需要使用括号:

if (q1_valid == false) {
  cout << "Invalid answer." <<endl;
  goto Question_1;
}

如果不使用括号,if仅在if条件的计算结果为true时才执行紧随其后的第一个语句。

答案 2 :(得分:2)

if之后的语句周围没有大括号,因此只有第一个语句是有条件的。在这种情况下,这意味着“q1_valid = true;”无论答案是什么,都会跑。

if (q1_answer == 4) {
 q1_correct = false;
 q1_valid = true;
}

你需要一个编辑器,通过缩进向你展示。

例如,

emacs将会出现

答案 3 :(得分:2)

别忘了使用括号。

答案 4 :(得分:2)

if语句的括号是必需的。

您是否考虑过使用switch语句:

switch (q1_answer){
  case 1:
    q1_correct = false;
    q1_valid = true;
    break;
  case 2:
    q1_correct = false;
    q1_valid = true;
    break;
  case n:
    //...
    break;
}