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

时间:2019-04-09 21:59:37

标签: coldfusion ternary-operator 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的初始设置。完成了。

2 个答案:

答案 0 :(得分: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 :(得分: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);

    ...
}