三元运算符中的变量从不递增

问题描述 投票:1回答:2

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的初始设置。这是完整的。

coldfusion ternary-operator cfml coldfusion-2016
2个回答
4
投票

这就是后缀增量的工作原理。我将演示使用汇编程序和使用寄存器的操作顺序,以避免混淆临时变量(实际上不存在)。

这些说明(后缀增量):

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
投票

当q.rel为3时,所有这些都可以减少到:

pCode = pCode++;

问:那么这是平等的呢? 答:它什么都不做。 pCode永远不会增加

pCode = ++pCode;

增量。或者更完整:

for (q in qry) {

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

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.