Проверки
Проверка значения может осуществляться или оператором if, или оператором switch:
if ( выражение ) оператор if ( выражение ) оператор else оператор switch ( выражение ) оператор
В C++ нет отдельного булевского типа. Операции сравнения
== != < <= > >=
возвращают целое 1, если сравнение истинно, иначе возвращают 0. Не так уж непривычно видеть, что ИСТИНА определена как 1, а ЛОЖЬ определена как 0. В операторе if первый (или единственный) оператор выполняется в том случае, если выражение ненулевое, иначе выполняется второй оператор (если он задан). Отсюда следует, что в качестве условия может использоваться любое целое выражение. В частности, если a целое, то
if (a) // ...
эквивалентно
if (a != 0) // ...
Логические операции
&& || !
наиболее часто используются в условиях. Операции && и || не будут вычислять второй аргумент, если это ненужно. Например:
if (p && 1count) // ...
вначале проверяет, является ли p не нулем, и только если это так, то проверяет 1count.
Некоторые простые операторы if могут быть с удобством заменены выражениями арифметического if.
Например:
if (a <= d) max = b; else max = a;
лучше выражается так:
max = (a<=b) ? b : a;
Скобки вокруг условия необязательны, но я считаю, что когда они используются, программу легче читать.
Некоторые простые операторы switch можно по-другому записать в виде набора операторов if.
Например:
switch (val) { case 1: f(); break; case 2; g(); break; default: h(); break; }
иначе можно было бы записать так:
if (val == 1) f(); else if (val == 2) g(); else h();
Смысл тот же, однако первый вариант (switch) предпочтительнее, поскольку в этом случае явно выражается сущность действия (сопоставление значения с рядом констант). Поэтому в нетривиальных случаях оператор switch читается легче.
Заботьтесь о том, что switch должен как-то завершаться, если только вы не хотите, чтобы выполнялся следующий case.
Например:
switch (val) { // осторожно case 1: cout << "case 1\n"; case 2; cout << "case 2\n"; default: cout << "default: case не найден\n"; }
при val==1 напечатает
case 1 case 2 default: case не найден
к великому изумлению непосвященного. Самый обычный способ завершить случай - это break, иногда можно даже использовать goto.
Например:
switch (val) { // осторожно case 0: cout << "case 0\n"; case1: case 1: cout << "case 1\n"; return; case 2; cout << "case 2\n"; goto case1; default: cout << "default: case не найден\n"; return; }
При обращении к нему с val==2 выдаст
case 2 case 1
Заметьте, что метка case не подходит как метка для употребления в операторе goto:
goto case 1; // синтаксическая ошибка
1 2 3
8 8 8
|