【问题标题】:Self-assignment through ternary operator通过三元运算符自赋值
【发布时间】:2015-04-06 05:33:59
【问题描述】:

是否可以通过三元运算符为变量赋值,而不必两次引用同一个变量?

例如,有没有这样的方法:

a=a=="1"?"yes":"no";

可以这样吗?:

a=="1"?"yes":"no";

我知道上面的那行可能行不通,所以我要求一个简短的替代方案,考虑到第一行。

对于小变量名(如上面的示例),这不是什么大问题。但是,如果在使用数组和更大的变量名时有办法帮助保持代码紧凑,那就太好了。我会对 Javascript 和 PHP 解决方案感兴趣。

【问题讨论】:

  • 没有没有办法(对于php)
  • 不,你的第二种方法行不通。你需要做一些类似于你的第一种方式的事情。
  • 您必须先访问变量才能读取,然后才能写入。
  • 我最近在 PHP 中尝试了以下内容:$a="1"?"yes":"no";它总是返回“是”,所以至少在 PHP 中会发生某种形式的赋值,尽管并不总是正确的。
  • @TristanBailey 这将始终将"yes" 分配给$a,无论其先前的值如何。

标签: javascript php ternary-operator


【解决方案1】:

检查一下

<?php
$a = 5;    
$a = ($a==5) ? 'yes' : 'no';    
echo 'the result is '.$a; // the result is yes
?>

【讨论】:

  • 除了...您刚刚在第二次出现的相同变量周围加上括号,有效地 extending 在我的问题的第一行代码上。我想检查变量并为其赋值,而不是多次键入同一个变量。
  • 嗨@Tristan Bailey,第 2 行检查变量 $a 并根据条件分配 $a 的新值。如果没有第 1 行,则 echo 的结果将是“结果为否”。
  • 嗨@Tristan Bailey,我已经解释了我的回答。在检查变量之前需要为其分配一个值,这是我试图从我的回答中表达出来的。
【解决方案2】:

不,三元运算符严格定义为:

p ? vt : vf

p 是一个导致布尔值的表达式(因此是一个测试),vt 的值以防p 为真,vf 以防测试为假。没有办法引入副作用。当然,测试(可以是函数调用或任何东西)可能会产生副作用。

据我所知,在任何情况下都没有运算符具有这种副作用。这也可能是一个坏主意:副作用应该有据可查并且有点明确。如果事情在没有任何语法警告的情况下发生,源代码将变得难以阅读、调试和理解。

您确实可以将结果分配给如下变量:

JavaScript 中:

var x = 3;
var x = (x < 3) ? "smaller" : "larger";

或者在PHP中:

$x = 3;
$x = ($x < 3) ? "smaller" : "larger";

但是,您在这里使用= 运算符警告x 的值将在该指令之后发生变化。

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 2019-11-05
    • 2011-07-02
    • 2012-02-14
    • 2021-04-29
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多