2016-03-09 2 views
-1

В то время как часть меня смущает, когда она говорит, что j ++ делает это j = 2 или 3?Почему выходной 1? это потому, что это правда?

#include <stdio.h> 
int main() { 
int i=2,j=2; 
while(i+1?--i:j++) 
    printf("%d",i); 
return 0; 
} 
+0

Условие 'while', похоже, написано с намерением запутать. Любая проводка такого кода должна быть снята ... книга по написанию читаемого кода. – Carcigenicate

+0

И чтобы ответить на ваш вопрос, вы его отлаживали? Это было бы очень легко ответить самостоятельно. – Carcigenicate

+0

Я согласен с @Carcigenicate - я никогда не видел и никогда не буду использовать троянец. – BryanT

ответ

3

В while выражение, i+1?--i:j++, сначала проверяет, если i+1 ненулевая. Если да, то он оценивает --i, используя его как тест while. Если нет, то он оценивает j++, используя его как тест while.

Первоначально i равно 2, поэтому i+1 - это 3, который отличен от нуля. Таким образом, он оценивает --i, который равен 1, и теперь i 1. Затем он выполняет тело, печать 1.

во второй раз, равно 1 i, поэтому i+1 2, который не равен нулю. Так что еще раз оценивает --i, что 0, и i теперь 0. Затем выходит из цикла, так как значение выражения while 0.

+0

Так что j никогда не тестировалось (при начальных условиях i = 2 и j = 2). И он никогда не печатается и не используется. – BryanT

0

Это очень запутанный, но легче понять, если вы нарушите тройное выражение из-за этого.

x = i+1?--i:j++; 

Значение x будет определять, продолжается ли это время или нет.

то значение х будет, как, например:

(i = 2, j = 2) 
x = i+1?--i:j++ = 3 ? --i : _ // i + 1 == 3 which != 0, so x = --i which is 1, j is ignored 
(i = 1, j = 2) 
x = i+1?--i:j++ = 2 ? --i : _ // i + 1 == 2 which != 0, so x = --i which is 0, j is ignored 

в этой точке, а (х) будет выйти из цикла, потому что х = 0 = ложным. printf вызывается только один раз со значением x, которое в этой точке равно 1

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