q.rel
может быть 1, 2 или 3
for (q in qry) {
pCode = (q.rel NEQ 3 ? q.rel
: pCode GTE 3 ? pCode++ : 3);
...
}
Если есть куча q.rel равно 3 подряд, pCode
должен увеличиваться, но показывает только 3.
Обратите внимание, что начальной настройки pCode
больше нигде нет. Это завершено.
Когда q.rel равно 3, все это можно сократить до:
pCode = pCode++;
В. Чему это равно?
А. Ничего не делает. pCode
никогда не увеличивается
pCode = ++pCode;
увеличивает. Или более полно:
for (q in qry) {
pCode = (q.rel NEQ 3 ? q.rel
: pCode GTE 3 ? ++pCode : 3);
...
}
Вот как работает постфиксное инкрементирование. Я продемонстрирую порядок операций с ассемблером и использую регистры, чтобы избежать путаницы с временной переменной (которой на самом деле не существует).
Эти инструкции (постфиксный инкремент):
x = 0;
x = x++;
// x is still 0
перевести на:
mov eax, 0 ; x = 0
mov ebx, eax ; x assignment on the right-hand side
mov eax, ebx ; x = x
inc ebx ; x++
«x» было увеличено после, присваивание было выполнено, и поэтому значение никогда не менялось.
Теперь эти инструкции (инкремент префикса):
x = 0;
x = ++x;
// x is now 1
перевести на:
mov eax, 0 ; x = 0
mov ebx, eax ; x assignment on the right-hand side
inc ebx ; ++x
mov eax, ebx ; x = x
«x» было увеличено до, присваивание было выполнено, и, таким образом, значение изменилось.
Почти так каждый язык программирования обрабатывает это. Это вообще не связано с тернарным оператором.