2014-09-19 3 views
-2
#include<stdio.h> 
main() 
{ 
int big,x=3,y=2,z=1,q=4; 
big=(x>y ? (x<z ? 20:10 && y>x ? 50:10) : (y>z ? 40:10 || x<q ? 30:10)); 
printf("big =%d",big); 
return 0; 
} 

& & - реляционный оператор, поэтому он должен возвращать истинное или ложное значение i.e 0 или 1, но в этом случае его нет. Пожалуйста, объясните, какова логика его выхода?Выход: реляционный и тернарный оператор?

Output: big =10 
+1

Пожалуйста, уточните вопрос, чтобы показать нам, что такое выход. –

+0

Кто пишет такой код? –

+0

Это взято с портала, где нужно предсказать вывод следующего фрагмента кода. Поскольку я не мог понять, что я разместил его здесь! –

ответ

1

Давайте сделаем ваше выражение немного более явным добавлением parethesis, чтобы показать преимущество:

((x>y) ? 
    ((x<z) ? 
    20 : ((10 && (y>x)) ? 50 : 10) 
    ) : (
    (y>z)?40:((10 || (x<q))?30:10) 
    ) 
) 

x больше, чем y, поэтому давайте рассмотрим

((x<z) ? 
    20 : ((10 && (y>x)) ? 50 : 10) 
) 

и x не является менее z, поэтому

((10 && (y>x)) ? 50 : 10) 

y не больше, чем x, так

10 

Вы можете видеть, что результаты не являются на самом деле вашими логическими операторами. Из-за сложности, вы должны почти наверняка выразить такую ​​оценку с помощью операторов if, чтобы разбить логику чистым способом.

1

Это все о приоритете оператора (и о трудном отсутствии круглых скобок).

Выход, который я получаю при запуске вашей программы, - 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) 

, потому что оператор && связывает более плотно, чем Оператор ?:.

В любом случае, если это настоящий код, вы должны обязательно добавить достаточно круглых скобок, чтобы разумно осведомленный читатель мог понять код без необходимости обращаться к таблице приоритетов оператора. Смешивание &&, || и ?: может быть особенно запутанным. Также может оказаться полезным разбиение выражения на подвыражения, а также назначение каждой переменной временной переменной (так что она имеет значимое имя).

Вышеупомянутое применяется, если вы пытаетесь сделать написать сложное выражение. Если вы пытаетесь понять то, что написал кто-то другой, вам в значительной степени нужно разобрать его самостоятельно. Попытайтесь сделать то, что я сделал: постепенно упрощайте выражение (путем удаления частей или добавления круглых скобок) способами, которые не меняют значения, подтверждая на каждом шаге, что вы получаете тот же результат. И если это производственный код (а не викторина, что это похоже), рассмотрите с жалобой на то, что заставляет автора писать более четкий код.

Смежные вопросы