Это все о приоритете оператора (и о трудном отсутствии круглых скобок).
Выход, который я получаю при запуске вашей программы, - nbig =10
(без новой строки: вы должны добавить \n
в строку формата).
Значение, присвоенное big
, не является результатом действия оператора &&
или ||
. Давайте уменьшим это чрезмерно сложное выражение, шаг за шагом. (Я подтвердил на каждом шаге, что результат не меняется.)
big=(x>y?(x<z?20:10 && y>x?50:10) : (y>z?40:10 || x<q?30:10));
Мы знаем, что x>y
верно, так что мы можем опустить тест и третий операнд соответствующего ?:
оператора:
big=(x<z?20:10 && y>x?50:10);
Давайте удалим лишние внешние скобки, добавить некоторые новые вокруг третьего операнда внешнего ?:
оператора, и изменить интервал немного:
big = x<z ? 20 : (10 && y>x?50:10);
Мы знаем, что x<z
является ложным, так что мы можем упасть, что и второго операнда внешней ?:
:
big = (10 && y>x?50:10);
Очевидно 10
верно, так:
big = (y > x ? 50 : 10);
И y > x
ложен , поэтому результат 10
- это то, что я получаю, когда запускаю вашу программу.
Вы, вероятно, предположили, что это:
a ? b : c && d ? e : f
эквивалентно:
(a ? b : c) && (d ? e : f)
, но на самом деле это эквивалентно:
a ? b : ((c && d) ? e : f)
, потому что оператор &&
связывает более плотно, чем Оператор ?:
.
В любом случае, если это настоящий код, вы должны обязательно добавить достаточно круглых скобок, чтобы разумно осведомленный читатель мог понять код без необходимости обращаться к таблице приоритетов оператора. Смешивание &&
, ||
и ?:
может быть особенно запутанным. Также может оказаться полезным разбиение выражения на подвыражения, а также назначение каждой переменной временной переменной (так что она имеет значимое имя).
Вышеупомянутое применяется, если вы пытаетесь сделать написать сложное выражение. Если вы пытаетесь понять то, что написал кто-то другой, вам в значительной степени нужно разобрать его самостоятельно. Попытайтесь сделать то, что я сделал: постепенно упрощайте выражение (путем удаления частей или добавления круглых скобок) способами, которые не меняют значения, подтверждая на каждом шаге, что вы получаете тот же результат. И если это производственный код (а не викторина, что это похоже), рассмотрите
с жалобой на то, что
заставляет автора писать более четкий код.
Пожалуйста, уточните вопрос, чтобы показать нам, что такое выход. –
Кто пишет такой код? –
Это взято с портала, где нужно предсказать вывод следующего фрагмента кода. Поскольку я не мог понять, что я разместил его здесь! –