Переменная в троичном операторе никогда не увеличивается

#coldfusion #ternary-operator #cfml #coldfusion-2016

#coldfusion #троичный оператор #cfml #coldfusion-2016

Вопрос:

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

Ответ №1:

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

Эти инструкции (постфиксный инкремент):

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

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

Ответ №2:

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

 pCode = pCode  ;
  

Вопрос: Итак, чему это равно?
A. Это ничего не делает. pCode никогда не увеличивается

 pCode =   pCode;
  

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

 for (q in qry) {

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

    ...
}