В то время как часть меня смущает, когда она говорит, что 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;
}
В то время как часть меня смущает, когда она говорит, что 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;
}
В 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.
Так что j никогда не тестировалось (при начальных условиях i = 2 и j = 2). И он никогда не печатается и не используется. – BryanT
Это очень запутанный, но легче понять, если вы нарушите тройное выражение из-за этого.
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
Условие 'while', похоже, написано с намерением запутать. Любая проводка такого кода должна быть снята ... книга по написанию читаемого кода. – Carcigenicate
И чтобы ответить на ваш вопрос, вы его отлаживали? Это было бы очень легко ответить самостоятельно. – Carcigenicate
Я согласен с @Carcigenicate - я никогда не видел и никогда не буду использовать троянец. – BryanT