2013-05-27 5 views
-2

Это мой код, который проверяет, является ли numOfAcc (переменная) меньше 10 или равно 0. Что затем продолжается с кодом, который я предоставил, если true.C++ if/else confusion

void customer::add_account() 
{ 
    int selec; 
    for(int i=0; i<10; i++) 
    { 
     if(numOfAcc<10 || numOfAcc == 0) 
     { 
      cout << "\n\nTo enter new account for this customer enter 1"; 
      cout << "\nTo go back please enter 0" << endl; 
      cin >> selec; 
      switch(selec) 
      { 
      case 0: 
       officer_func(); 
       break; 
      case 1: 
       bankAccount acc; 
       acc.getAccountDetails(); 
       accs[numOfAcc]=acc; 
       numOfAcc++; 
       break; 
       //b.getAccountDetails(); c.numOfAcc++; break; 
      } 
     } 
     else 
     { 
      cout<<"MAXIMUM ACCOUNTS LIMIT REACHED"<<endl; 
      cout << c.numOfAcc; //test code to check the value of numOfAcc which returns as ZERO 
     } 
    } 
    getch(); 
} 

Я уже инициализировал член numOfAcc (который принадлежит классу) как ZERO в другой функции. Но в режиме запуска всегда заканчивается оператор else «MAXIMUM ACCOUNTS LIMIT REACHED».

Я проверил, равен ли член numOfAcc нулю или нет с оператором cout, и он возвращается как ноль. Есть проблема с if/else statments

Что случилось с моим кодом?

+0

Нет, если он равен 10, я не разрешаю создавать какие-либо счета. Все еще не решает, приятель. Заканчивается в заявлении else – user2425207

+0

Моя проблема в том, что даже когда numOfAcc равно нулю или меньше 10 .. он заканчивается иначе .... whaaaat:/ – user2425207

+3

@ user2425207 Можете ли вы предоставить [полный и компилируемый] (http://sscce.org), который воспроизводит проблему? –

ответ

1

Во-первых, в if (numOfAcc<10 || numOfAcc == 0) вторая часть не нужна, потому что если numOfAcc является 0, то это будет уже < 10.

Во-вторых, если вы уверены, что numOfAcc является 0, и что существует проблема с вашим «если» заявление, так как вы вводите «еще» со значением 0 nomOfAcc, вы можете написать следующее:

if (numOfAcc<10 || numOfAcc == 0) 
{ 
    ... 
} 
else 
{ 
    assert(numOfAcc != 0); // assert what "should be true" 
    cout << ... 
} 

Затем запустите отладочную сборку кода. Один из этих двух вещей будет:

  • Если не удается утверждают: Вы правы. В какой-то момент вы вводите ветку else с numOfAcc == 0. То, что вы говорите в своем вопросе, верно.
  • Если заявка не fail: Вы ошибаетесь. Вы никогда не вводите ветку else с numOfAcc == 0. То, что вы говорите в своем вопросе, неверно.

Обратите внимание, что из этих двух возможных результатов первая невозможна.

Что происходит, когда вы проводите этот тест?

0

У вас есть короткие вопросы замыкания в коде (Как сказал @MikeSeymour - это не вызовет каких-либо проблем, как сейчас, но что-то исправить, прежде чем это больно)

if(numOfAcc<10 || numOfAcc == 0) 

numOfAcc == 0 будет оцениваться только если numOfAcc <10, т.е. второе условие оценивается только в том случае, если первое условие является ложным. В противном случае условие if истинно, а второе условие не нужно оценивать, так как true || false == true, поэтому оценка второго условия не выполняется.

Итак, у вас должны быть отдельные проверки, так как если число равно 0, оно всегда меньше 10, и поэтому условие всегда будет истинным.

Эта ссылка может быть полезна для вас - http://en.wikipedia.org/wiki/Short-circuit_evaluation

В вашей еще части вас есть c.numOfAcc Но в проверках вы используете numOfAcc. Почему это непоследовательно?Может быть, вы должны использовать if(c.numOfAcc<10 || c.numOfAcc == 0)

+0

Это не отвечает на вопрос. Вторая проверка является избыточной, но это не вызовет никаких проблем. –

+0

@MikeSeymour да, согласен. Я обновил ответ с одной вероятной причиной этой проблемы. – Bill

0
if (numOfAcc == 0) 
{ 
} 
else 
{ 
    cout << c.numOfAcc; 
} 

Это может печатать только ноль, потому что numOfAcc и c.numOfAcc две разные вещи.

Нет ничего плохого в операциях if...else.

С кодом, который другие ответы объяснили, есть другие вещи.