代码之家  ›  专栏  ›  技术社区  ›  iPadDeveloper2011

修复断链/堆叠php三元运算符

  •  1
  • iPadDeveloper2011  · 技术社区  · 13 年前

    在php中,如果您

    echo (('a'=='a')?'A':('a'=='b')?'B':'C');
    

    结果是:

    B
    

    哪个是 垃圾总量 。根据 php docs (example#3) 这是因为

    从左到右计算三元表达式。

    这对我来说并不能真正解释:从左到右进行评估, ('a'=='a') 所以结果是 'A' 不真的不知所措,无法理解php是如何获得 'B' 从这里。这种语句可以在许多语言中使用,但不能在php中使用。有人了解这里的php逻辑吗?以及如何最好地在php中解决这个问题?

    2 回复  |  直到 13 年前
        1
  •  1
  •   hexacyanide    13 年前

    这个 全部的 对左侧的表达式进行求值。这些是相同的:

    echo( ('a' == 'a') ? 'A' : ('a' == 'b')  ? 'B' : 'C');
    echo((('a' == 'a') ? 'A' : ('a' == 'b')) ? 'B' : 'C');
    

    以下表达式的计算结果为 A :

    ('a' == 'a') ? 'A' : ('a'=='b');
    

    这个表达式的求值结果为 B :

    ('A' ? 'B' : 'C');
    

    如果移动括号,表达式的计算结果将如您所期望的那样:

    echo(('a' == 'a') ? 'A' : (('a' == 'b') ? 'B' : 'C'));
    
        2
  •  0
  •   iPadDeveloper2011    13 年前

    在实验上,

    echo (('a'=='a')?'A':(('a'=='b')?'B':'C'))
    

    输出

    A
    

    php的实现似乎出了问题 operator precedence ,给予 : 优先级高于 ? ,所以在没有括号的情况下,

    ('a'=='a')?'A':('a'=='b')
    

    分组在一起,因此表达式:

    ('a'=='a')?'A':('a'=='b')?'B':'C'
    

    计算为

    ('A'?'B':'C');
    

    结果是 'B' (作为 'A' 不是 0 或 FALSE ,也是 TRUE ).

    推荐文章