在PHP中是否有像??C#一样的三元运算符?
?? 在C#中是干净和短,但在PHP中,你必须做的事情如下:
// This is absolutely okay except that $_REQUEST['test'] is kind of redundant.
echo isset($_REQUEST['test'])? $_REQUEST['test'] : 'hi';
// This is perfect! Shorter and cleaner, but only in this situation.
echo null? : 'replacement if empty';
// This line gives error when $_REQUEST['test'] is NOT set.
echo $_REQUEST['test']?: 'hi';
Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直在搜索网络,声明总是有if和else条件如a ? b : c.我想知道是否if可以不使用三元语句else.假设我有以下代码,我希望关闭PreparedStatement它,如果它不是null
(我使用的是Java编程语言.)
PreparedStatement pstmt;
//....
(pstmt!=null) ? pstmt.close : <do nothing>;
Run Code Online (Sandbox Code Playgroud) 考虑一下这段代码:
struct Base
{
int x;
};
struct Bar : Base
{
int y;
};
struct Foo : Base
{
int z;
};
Bar* bar = new Bar;
Foo* foo = new Foo;
Base* returnBase()
{
Base* obj = !bar ? foo : bar;
return obj;
}
int main() {
returnBase();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这在Clang或GCC下不起作用,给我:
错误:不同指针类型'Foo*'和'Bar*'之间的条件表达式缺少一个强制转换Base*obj =!bar?foo:bar;
这意味着要编译我必须将代码更改为:
Base* obj = !bar ? static_cast<Base*>(foo) : bar;
Run Code Online (Sandbox Code Playgroud)
由于隐式转换为Base*存在,是什么阻止编译器这样做?
换句话说,为什么没有Base* obj = foo;演员而是使用?:操作员的工作呢?是因为我不清楚我想使用这Base部分吗?
c++ ternary-operator language-lawyer implicit-conversion c++17
JSTL的以下标记可用于将值设置为请求范围中的变量.
<c:set var="value" scope="request" value="someValue"/>
Run Code Online (Sandbox Code Playgroud)
我想要有条件地检查,如果value设置的变量是否为空,并显示相应的结果,如下所示,使用<c:when>...</c:when>.
<c:choose>
<c:when test="${not empty value}">
<c:out default="None" value="${value}"/>
</c:when>
<c:otherwise>
<c:out default="None" value="None"/>
</c:otherwise>
</c:choose>
Run Code Online (Sandbox Code Playgroud)
我想使用三元表达式来减少代码行,比如
<c:out default="None" value="${not empty value ? value : 'None'}"/>
Run Code Online (Sandbox Code Playgroud)
它被评估,因为它实际上意味着,但如果我交换表达式的顺序,如,
<c:out default="None" value="${empty value ? 'None' : value}"/>
Run Code Online (Sandbox Code Playgroud)
然后是语法错误指示,
"$ {空值?'无':值}"包含无效表达式:javax.el.ELException:错误解析:$ {空值?'无':值}
那么为什么会这样呢?
我正在使用该JSTL 1.1库,包含以下taglib,
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Run Code Online (Sandbox Code Playgroud) 我已经看到它在某处讨论过以下代码导致obj成为a Double,但它200.0从左侧打印.
Object obj = true ? new Integer(200) : new Double(0.0);
System.out.println(obj);
Run Code Online (Sandbox Code Playgroud)
结果:200.0
但是,如果您在右手边放一个不同的对象,例如BigDecimal,类型obj是Integer理所应当的.
Object obj = true ? new Integer(200) : new BigDecimal(0.0);
System.out.println(obj);
Run Code Online (Sandbox Code Playgroud)
结果:200
我认为这样做的原因是将左侧投射到a/与比较和计算double相同的方式,但这里左右两侧不会以这种方式相互作用.integerdouble
为什么会这样?
通常是'?' 运算符以下列形式使用:
A ? B : C
Run Code Online (Sandbox Code Playgroud)
然而,在B = AI的情况下,已经看到以下缩写
A ? : C
Run Code Online (Sandbox Code Playgroud)
这令人惊讶地起作用.是否更好地保留第二个参数(样式方式),或者某些编译器是否有机会无法处理它?
是否可以在JavaScript中执行此类操作?
max = (max < b) ? b;
Run Code Online (Sandbox Code Playgroud)
换句话说,仅在条件为真时指定值.如果条件为假,则不执行任何操作(无分配).这可能吗?
我遇到了其他人写的代码.推荐使用条件运算符还是常用?我觉得它不太可维护 - 或者只是我?有没有其他的写作方式?
exp_rsp_status = req.security_violation ? (dis_prot_viol_rsp && is_mstr) ?
uvc_pkg::MRSP_OKAY : uvc_pkg::MRSP_PROTVIOL : req.slv_req.size() ?
((is_mst_abort_rsp && dis_mst_abort_rsp) ||
((req.slv_req[0].get_rsp_status()==uvc_pkg::MRSP_PROTVIOL) && dis_prot_viol_rsp) ||
(is_mst_abort_rsp && req.is_pci_config_req() && dis_pcicfg_mst_abort_rsp)) ?
uvc_pkg::MRSP_OKAY : req.slv_req[0].get_rsp_status() : uvc_pkg::MRSP_OKAY;
Run Code Online (Sandbox Code Playgroud) 我正在编写一个控制台应用程序,试图通过反复试验来"猜测"一个数字,它工作得很好,除了它让我想知道某个部分是我心不在焉地写的,
代码是:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x,i,a,cc;
for(;;){
scanf("%d",&x);
a=50;
i=100/a;
for(cc=0;;cc++)
{
if(x<a)
{
printf("%d was too big\n",a);
a=a-((100/(i<<=1))?:1);
}
else if (x>a)
{
printf("%d was too small\n",a);
a=a+((100/(i<<=1))?:1);
}
else
{
printf("%d was the right number\n-----------------%d---------------------\n",a,cc);
break;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更具体地说,困惑我的部分是
a=a+((100/(i<<=1))?:1);
//Code, code
a=a-((100/(i<<=1))?:1);
Run Code Online (Sandbox Code Playgroud)
我曾经((100/(i<<=1))?:1)确保如果100/(i<<=1)返回0(或错误),整个表达式将计算为1 ((100/(i<<=1))?:***1***),并且我离开条件的部分,如果它是真的空的((100/(i<<=1))? _this space_ :1),它会工作,它似乎工作正常但是有离开的风险条件空的那部分?
在PHP手册中,我在"操作员"下找到以下"用户提供的注释 ".
请注意,在php中,三元运算符?:具有左关联性,与C和C++不同,它具有正确的关联性.
你不能编写这样的代码(正如你在C/C++中习惯的那样):
Run Code Online (Sandbox Code Playgroud)<?php $a = 2; echo ( $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other'); echo "\n"; // prints 'four'
我实际上尝试它,它真的打印four.但是,我无法理解它背后的原因,仍然觉得它应该打印two或other.
有人可以解释一下这里发生了什么,为什么打印'四'?
ternary-operator ×10
c ×2
c++ ×2
java ×2
php ×2
c++17 ×1
casting ×1
conditional ×1
el ×1
if-statement ×1
javascript ×1
jsp ×1
jstl ×1
operators ×1
php-7 ×1
ternary ×1