условный оператор в вопросе C

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

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

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

Что y равно 5. Значения после оператора: x = 0, y = 5 и z = 4. Я знаю, что условный оператор работает следующим образом: переменная = условие? значение, если истинно : значение, если ложно.

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


person Seephor    schedule 19.05.2010    source источник
comment
Ого, я выхожу на 5 минут, а уже столько ответов. Теперь это имеет большой смысл. Спасибо за ответы на все вопросы! Я точно запомню, чтобы никогда так не писал :)   -  person Seephor    schedule 19.05.2010
comment
Я нахожу забавным, что почти все предположили, что проблема заключается в пост-декременте, когда x сбивает с толку, а не в ФАКТИЧЕСКОЙ проблеме, которая заключается в том, что приоритет между += и ?: сбивает с толку...   -  person Brian Postow    schedule 19.05.2010


Ответы (13)


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

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

person nc3b    schedule 19.05.2010

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

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

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

person Maciej Hehl    schedule 19.05.2010
comment
+1 за фактический ответ на путаницу. приоритет с ?: НИКОГДА не следует принимать как должное. - person Brian Postow; 19.05.2010

Просто разбейте его на аналогичный оператор if:

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

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

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

person Carl Norum    schedule 19.05.2010
comment
Как, например? как у тебя или как у него? - person Dervin Thunk; 19.05.2010
comment
@ Дервин, как и его. Но и эта слегка расширенная версия не очень хороша. - person Carl Norum; 19.05.2010
comment
да, проголосовал. использование ifs — интересный педагогический совет. - person Dervin Thunk; 19.05.2010
comment
Вы должны быть осторожны с версией инструкции if, так как она не на 100% семантически идентична. В большинстве случаев это помогает понять, что происходит. - person Carl Norum; 19.05.2010

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

person Trevor Tippins    schedule 19.05.2010
comment
Если вы не работаете только над сольными проектами, вы все равно можете столкнуться с таким кодом от других разработчиков. - person R Samuel Klatchko; 19.05.2010
comment
Я знаю. Я был шутливым. Другие уже довольно кратко ответили на запрос ОП. - person Trevor Tippins; 20.05.2010

Причина этого в том, что оператор постдекремента/инкремента (x++ или x--) делает следующее:

  1. увеличить или уменьшить переменную
  2. вернуть исходное значение.

Таким образом, возвращаемое значение x-- равно 1, что указывает на истину, поэтому оператор z++ оценивается, возвращая исходное значение 3.

Поскольку y = 2, y += 3 равно 5.

person John Ledbetter    schedule 19.05.2010

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

Таким образом, во время оценки x равно 1, z равно 3, а после оценки выражения x становится 0 и z 4; и у = 2 + 3 = 5

person Shravan    schedule 19.05.2010
comment
+1, чтобы не писать такой код. Это то, о чем вы должны знать, тем не менее - person Shravan; 19.05.2010

Помните, что операторы инкремента и декремента возвращают разные вещи в зависимости от того, расположены ли они до или после имени переменной.

В частности, когда вычисляется x--, он уменьшает x на 1, но возвращает неизмененное значение x, которое в данном случае равно 1. В C 1 оценивается как true, поэтому тернарный оператор вернет z++.

И снова, поскольку оператор ++ ставится после переменной, возвращаемое значение z++ является немодифицированным значением z, равным 3.

Таким образом, это сводится к y += 3, в результате чего y равно 5.

person Syntactic    schedule 19.05.2010

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

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

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

person agent oranje    schedule 19.05.2010

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

person Incognito    schedule 19.05.2010

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

person John Bode    schedule 19.05.2010

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

person Ryan Zauber    schedule 19.05.2010
comment
Я думаю, проблема в том, что он предполагает x-- == 0, судя по его эквивалентности 2 += 0. - person Chuck; 19.05.2010

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

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

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

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

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

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

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

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

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

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

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

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

person K V Ajay Kumar    schedule 20.07.2013

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

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

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

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

person Mahesh Nandala    schedule 26.10.2014