Почему это кодирует, всегда производят x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
1-я x++
меняет x на 1 и возвращает 0
.
2-я x++
меняет х на 2 и возвращает 1
, в которой точка или короткое замыкание, возвращает истину и оставляет х на 2.
x ++ || х ++ || х ++ || х ++ || ........;
1 x ++
Изменяет x до 1 и возвращает 0
2-й X ++
изменяет x до 2 и возвращает 1
, в результате чего точка или короткие схемы возвращаются истины и оставляет x на 2.
-121--2741457- ||
короткие замыкания. Оценивается слева, когда найден истинное значение (ненулевое значение), он останавливает оценку, поскольку выражение сейчас верно и никогда не может быть ложным снова.
Сначала X ++
оценивается до 0 (поскольку это пост-приращение), второе до 1, что верно, а Presto, вы закончите!
, поскольку логичный ИЛИ короткие замыкания, когда истинное найдено.
, Таким образом, первый x ++ возвращается 0 (ложь), потому что это - постинкремент. (x = 1) Второй x ++ возвращается 1 (верный) - короткие замыкания. (x = 2)
Печать x = 2;
попытка замены ||
с |
. -
Это - срывание логических операторов.
Это - та же причина, когда вы сделаете
if (returns_true() || returns_true()){ }
, returns_true
только назовут однажды.
Когда вы оцениваете «a || b || c || d || e || ...», вы можете перестать оценивать при первом ненулевом значении.
Первый «X ++» оценивается до 0, а приращения X до 1 и оценка выражения продолжается. Второй x ++ оценивается до 1, увеличивает x до 2, и в этот момент вы не должны смотреть на остальные или оператор, чтобы знать, что он будет правдой, поэтому вы остановитесь.
, потому что первый «X ++ || X ++» оценивает «true» (что означает, что это не ноль, потому что «0 || 1» верно. Так как они все логические или операторы остальные или операции игнорируются.
Майк
Оператор ||
Оператор оценивает выражение левого рук, и если оно 0 (false), то он оценивает правопреемное выражение. Если левая сторона не 0, то она вообще не оценивает правую сторону.
В выражении х ++ || х ++ || х ++ || ...
, первый X ++
оценивается; Он оценивается до 0, и X увеличивается на 1. Второе x ++
оценивается; Он оценивает 1, и X увеличивается до 2. С второго x ++
оценивается с ненулевым значением, ни один из оставшихся выражений x ++
оценивается.
Из-за ранней оценки сравнений.
Это эквивалент
0++ | 1++
Компилятор прекращает сравнение, как только x==1, затем он постует инкременты, делая x==2
. Оператор < >
используется в стандарте SQL, поэтому большинство знающих SQL пользователей привыкнут к нему или, по крайней мере, знают об этом. Я сам даже не знал, что оператор ! =
также был доступен в некоторых диалектах SQL до недавнего времени.
Как вы заметили, люди, как правило, используют только один или другой, и это хороший подход, по крайней мере, на проектной основе. Независимо от того, что вы выберете, будьте последовательны.
-121--1275922-Надеюсь, что это не будет дыра в безопасности!:)
Но если оба ваших сайтов являются поддоменами в одном домене, может помочь document.domain .
-121--3057614- Из-за короткого замыкания при вычислении логического выражения и из-за того, что | |
является последовательностью , пунктом в C и C++.