Бьерн Страуструп.
Язык программирования С++
91
В языке С++ среди основных типов нет отдельного булевского (тип
со значениями истина, ложь). Все
операции отношений:
== != < > <= >=
дают в результате целое 1, если отношение выполняется, и 0 в противном случае. Обычно определяют
константы TRUE как 1 и FALSE как 0.
В операторе if, если выражение имеет ненулевое значение, выполняется первый оператор, а
иначе
выполняется второй (если он указан). Таким образом, в
качестве условия допускается любое
выражение типа целое или указатель. Пусть a целое, тогда
if (a) // ...
эквивалентно
if (a != 0) ...
Логические операции
&& || !
обычно используются в условиях. В операциях && и || второй операнд не вычисляется, если результат
определяется значением первого операнда. Например, в выражении
if (p && l
count) // ...
сначала проверяется значение p, и
только если оно не равно нулю, то проверяется отношение l
>count. Некоторые простые операторы if удобно заменять выражениями условия. Например, вместо
оператора
if (a <= b)
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();
Смысл обеих конструкций совпадает, но все же первая предпочтительнее, поскольку в ней нагляднее
показана суть операции: проверка на совпадение значения val со значением из множества констант.
Бьерн Страуструп.
Язык программирования С++
92
Поэтому в нетривиальных случаях запись, использующая переключатель, понятнее.
Нужно позаботиться о
каком-то завершении оператора, указанного в
варианте переключателя, если
только вы не хотите, чтобы стали выполняться операторы из следующего варианта. Например,
переключатель
switch (val) { // возможна ошибка
case
1:
cout << "case 1\n";
case
2:
cout << "case 2\n";
default:
cout << "default: case not found\n";
}
при val==1 напечатает к большому удивлению непосвященных:
case 1
case 2
default:
case not found
Имеет смысл отметить в комментариях те редкие случаи, когда стандартный переход на следующий
вариант оставлен намеренно. Тогда этот переход во всех остальных случаях можно смело считать
ошибкой. Для завершения оператора в варианте
чаще всего используется break, но иногда
используются return и даже 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 not found\n";
return;
}
Здесь при значении val равном 2 мы получим:
case 2
case 1
Отметим, что метку варианта нельзя использовать в операторе goto:
goto case 2; // синтаксическая ошибка
Достарыңызбен бөлісу: