通过三元运算符自赋值
Self-assignment through ternary operator
是否可以通过三元运算符为变量赋值,而不必两次引用同一个变量?
例如,有没有办法像这样:
a=a=="1"?"yes":"no";
这样可以吗?:
a=="1"?"yes":"no";
我知道上面的行可能行不通,所以我要求一个简短的替代方案,给定第一行。
对于小变量名(如上例),这不是什么大问题。但是,如果在使用数组和更大的变量名时有一种方法可以帮助保持代码紧凑,那就太好了。我会对 Javascript 和 PHP 两个解决方案感兴趣。
不是,三元运算符严格定义为:
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
的值将在该指令后更改。
检查这个
<?php
$a = 5;
$a = ($a==5) ? 'yes' : 'no';
echo 'the result is '.$a; // the result is yes
?>
是否可以通过三元运算符为变量赋值,而不必两次引用同一个变量?
例如,有没有办法像这样:
a=a=="1"?"yes":"no";
这样可以吗?:
a=="1"?"yes":"no";
我知道上面的行可能行不通,所以我要求一个简短的替代方案,给定第一行。
对于小变量名(如上例),这不是什么大问题。但是,如果在使用数组和更大的变量名时有一种方法可以帮助保持代码紧凑,那就太好了。我会对 Javascript 和 PHP 两个解决方案感兴趣。
不是,三元运算符严格定义为:
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
的值将在该指令后更改。
检查这个
<?php
$a = 5;
$a = ($a==5) ? 'yes' : 'no';
echo 'the result is '.$a; // the result is yes
?>