условный оператор в вопросе C - PullRequest
3 голосов
/ 19 мая 2010

У меня просто быстрый вопрос об условном операторе. Все еще начинающий программист здесь. Мне дано x = 1, y = 2 и z = 3.

Я хочу знать, почему после этого утверждения:

y += x-- ? z++ : --z;

То, что y равно 5. Значения после оператора: x = 0, y = 5 и z = 4. Я знаю, что условный оператор работает так: он отформатирован так: переменная = условие? значение, если true: значение, если false.

Для условия y + = x--, как y становится 5? Я вижу только 2 (2 + = 0) и 3 (2 + = 1) (тогда x-- становится равным нулю) как возможности. Буду признателен за любую оказанную помощь. :)

Ответы [ 13 ]

10 голосов
/ 19 мая 2010

Когда он оценивает условие (x! = 0), x по-прежнему равен 1 (то есть not 0). Так что выбирает z++. Что еще 3. 2 + 3 = 5. В конце дня х стал 0, а з стал 4.

Посмотрите здесь для деталей. Важно запомнить простую вещь: когда вы говорите x ++, используется текущее значение x, а , а затем увеличивается. Когда вы говорите ++x, оно сначала увеличивается, а затем используется.

7 голосов
/ 19 мая 2010

Оператор?: Имеет более высокий приоритет, чем оператор + =. Итак, Ваше выражение оценивается как

y += (x-- ? z++ : --z);

значение выражения x-- ? z++ : --z является значением выражения z++ (то есть 3), поскольку значение выражения x-- равно 1

6 голосов
/ 19 мая 2010

Просто разбейте его на аналогичное if утверждение:

if (x--)
    y += z++;
else
    y += --z;

В вашем случае, поскольку x равно 1, вы примете "истинную" сторону этого оператора if. Это означает, что вы добавляете z++ к y, давая 3 + 2, в результате 5.

Пожалуйста, не пишите такой код.

1 голос
/ 19 мая 2010

Как начинающий программист, просто знайте, что вы НИКОГДА не должны писать что-то подобное, чтобы вы могли забыть об этом, беспокоя вас!

0 голосов
/ 26 октября 2014

Как мы знаем операторы проверяют условие, если оно равно true i.e 1, оно выполняет истинное утверждение.

Если это false i.e 0, выполняется ложное утверждение

Если мы инициализируем значение x to 1, оно выполняет true оператор

В результате он выставляет результат 5 из истинной части y=(y+z++)

0 голосов
/ 20 июля 2013

y + = (x--? Z ++: --z); так что это ваш вопрос, и ответ прост ................

Как мы знаем, что-то вроде X-- или x ++ называется постинкрементным или декрементным. Таким образом, в соответствии с правилами последующего увеличения или уменьшения, выражение будет сначала оценено, а затем вступит в действие только увеличение или уменьшение. сначала оценить, а затем увеличить или уменьшить .....

СЕЙЧАС разрешим ваш вопрос:

Y + = X -? Z ++: - Z .... теперь он содержит три части, то есть левую, среднюю и правую ... теперь точка зрения такова: «если левая часть верна, то она вернется средняя часть, в противном случае правая часть ... и выполнение всегда начинается с левой части, так как это условная часть "

Теперь упростим выражение как: Y + = X? Z: Z; .... Теперь посмотрим, имеет ли левая часть пре- или постинкрементное увеличение или уменьшение ..... если post ++ / - сначала der den оценить упрощенное утверждение ...... ден идти для ++ / --.....

Теперь левая часть имеет пост декремент ... так что давайте сначала оценим выражение ... т.е. 1011 *

y + = 1: 3: 3 // любое ненулевое значение в части условия является истинным условием (т. Е. 1)

так что теперь наше условие истинно, и оно вернет среднюю часть, и когда элемент управления перейдет в среднюю часть, тогда будет уменьшено только значение x, т. Е. Оно станет 0 ....

Теперь 2-е упрощенное утверждение - Y + = Z. (\\ так как условие истинно и мы получили среднюю часть, компилятор пропустит оставшуюся часть, т.е. правую часть.)

Теперь посмотрим, является ли Z post ++ / - (или) pre ++ / -) ... хахх ... его постинкремент ... так что сначала просто оцените упрощенный оператор2, а затем увеличьте значение Z. ... т.е.

                     Y+=Z =>Y=Y+Z
                    =>Y=2+3 =>y=5

Теперь выражение вычисляется, т. Е. Y = 5, поэтому теперь увеличиваем значение Z, т. Е. Оно становится 4

0 голосов
/ 19 мая 2010

Я думаю, что ваша основная проблема заключается в том, что вы предполагаете, что y+= x-- - это ваше состояние, тогда как на самом деле ваше состояние просто x--. Существует возврат от условного оператора, который делает y += результатом условной операции: x-- ? z++ : --z; равен 5. Другие комментарии имеют причину, по которой он фактически оценивается в 5.

0 голосов
/ 19 мая 2010

Выражение x-- соответствует текущему значению x, которое равно 1. Таким образом, результатом условного выражения будет z++, что оценивается как 3. 3 добавляется к y, в общей сложности из 5.

0 голосов
/ 19 мая 2010

Это нормально, потому что сначала «запускает» троичный оператор, затем выполняет декремент, поскольку ваш оператор декремента (x--) - это постфикс, поэтому вы получили z ++, равный 3, то есть 5 в y.

0 голосов
/ 19 мая 2010

x-- и z ++ уменьшают и увеличивают после их использования. При вычислении троичного оператора вы получите следующее:

y + = (1)? (3): (--z);

- z никогда не вызывается, условное значение принимает значение true и выполняет первый параметр в троичном операторе После использования x уменьшается, а z увеличивается.

...