Переменная в троичном операторе никогда не увеличивается - PullRequest
1 голос
/ 10 апреля 2019

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. Это завершено.

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

Так работает постфиксное увеличение. Я продемонстрирую порядок операций с ассемблером и буду использовать регистры, чтобы избежать путаницы с временной переменной (которая на самом деле не существует).

Эти инструкции (приращение постфикса):

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» был увеличен до , назначение было выполнено и, следовательно, значение изменилось.

Это почти то, как каждый язык программирования справляется с этим. Это никак не связано с троичным оператором.

1 голос
/ 10 апреля 2019

Когда q.rel равен 3, все это можно уменьшить до:

pCode = pCode++;

Q.Так что же это значит?
A. Это ничего не значит.pCode никогда не увеличивается

pCode = ++pCode;

увеличивает значение.Или более полно:

for (q in qry) {

    pCode = (q.rel NEQ 3 ? q.rel 
       : pCode GTE 3 ? ++pCode : 3);

    ...
}
...