Вы неправильно понимаете заявление switch
.
Оператор switch сравнивает выражение (часто простую переменную) в switch (expression)
с рядом различных значений константы времени компиляции в различных меток case
и выполняет код после этой метки. Если значение не соответствует ни одной из ярлыков case
, тогда используется метка default
, или весь switch
пропускается, если нет метки default
.
В вашем коде у вас есть var
, установленный в 1
. Ни case 'x':
ни case 'y':
матчи 1
(они не были бы эквивалентны case 120:
и case 121:
в большинстве кодировок на основе ASCII), и нет default
, поэтому switch
пропускается, и выход 1 2
(не так, как вы, кажется, ожидали , 2 2
).
Что такое постоянная времени компиляции?
Значения в метках case должны определяться компилятором при компиляции кода и должны быть постоянными выражениями. Это означает, что выражения в метках case не могут ссылаться на переменные или функции, но они могут использовать базовые вычисления для фиксированных (интегральных) значений.
Дано:
#include <math.h>
const int x = 3; // C++ compilers treat this differently
enum { BIG_TIME = 60 };
#define HOURS(x) (3600 * (x))
case sin(x): // Invalid - function of a variable
case x: // Invalid - variable
case sin(0.0): // Invalid - function
case 'x': // Valid - character constant
case 'xy': // Valid but not portable
case BIG_TIME: // Valid - enumeration value names are constant
case HOURS(2): // Valid - expands to (3600 * (2)) which is all constant
'var' не' x' или 'y', это' 1'. Каким будет ваш ожидаемый результат? –
, но x имеет значение 1, поэтому почему я не получаю выход 2,2 –
Каков требуемый выход? –