2012-05-17 2 views
1

Итак, для двух отдельных фрагментов кода, почему инкремент/декремент действуют по-разному?C Порядок операций

Фрагмент А:

i=7; j=8; k=9; 
printf("%d\n", i - 7 && j++ > k); 
printf("%d %d %d", i, j, k); 

будет производить следующий вывод:

0 
7 8 9 

Фрагмент B:

while (i > 0) 
printf("T minus %d and counting\n",i--); 

производит это:

T minus 5 and counting 
T minus 4 and counting 
T minus 3 and counting 
T minus 2 and counting 
T minus 1 and counting 

Теперь я знаю, что аргументы функций передаются по значению и что он должен иметь какое-то отношение к тому, что j используется в булевом выражении. Но эти две ситуации кажутся мне противоречивыми. Что тут происходит?

+1

Я предполагаю, что в фрагменте B 'i' инициализируется значением 5? Этот результат ожидается, если это так. –

+0

Какое поведение вы ожидаете? – robert

+0

Я думаю, что @grimetime пытается сказать, что он не понимает, почему 'i -' уменьшает значение i при каждом его вызове, но 'j ++' не изменяет значение j после его вызова. – Jamie

ответ

7

Хорошо, что вы собираетесь должны смотреть очень внимательно на то, как операторы старшинство расположены и как именно они работают. Поскольку это домашнее задание, я не собираюсь давать точный ответ, но вы должны сделать две вещи.

  1. Перепишите Лобовое выражения с полными скобками с помощью таблиц очередности
  2. Посмотрите на поведение &&точной. В частности, когда выполняется подвыражение j++ > k?
2

Это называется короткое замыкание. Когда левая рука & & оценивает фальшь, правая сторона больше не выполнена (пропущена).

+2

Ну, нет, это не оптимизировано - этот код будет вести себя одинаково без оптимизатора. –

+0

Ах, прости, ты прав. Слова вышли неправильно. Фиксация –

1

У вас есть короткое замыкание, действующее здесь (& &). Будет оценена только левая часть выражения.

0

Фрагмент А:

">" имеет больший приоритет, чем "& &", так что

printf("%d\n", i - 7 && j++ > k); 

так:

printf("%d\n", i - 7 && (j++ > k)); 

и "& &" является короткое замыкание потому что (i-7) == 0, FALSE, поэтому (j ++> k) будет проигнорировано, все эти три числа не являются chan ВГО.

Фрагмент B:

"i--" будет возвращать значение оригинала, во-первых, а затем минус один.

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