标签: ternary-operator

PHP中的C#的空合并运算符(??)

在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)

php ternary-operator null-coalescing-operator php-7

49
推荐指数
4
解决办法
1万
查看次数

如果没有其他三元运算符

到目前为止,我一直在搜索网络,声明总是有if和else条件如a ? b : c.我想知道是否if可以不使用三元语句else.假设我有以下代码,我希望关闭PreparedStatement它,如果它不是null

(我使用的是Java编程语言.)

PreparedStatement pstmt;

//.... 

(pstmt!=null) ? pstmt.close : <do nothing>;
Run Code Online (Sandbox Code Playgroud)

java if-statement ternary-operator

49
推荐指数
6
解决办法
4万
查看次数

三元运算符隐式转换为基类

考虑一下这段代码:

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

48
推荐指数
3
解决办法
2530
查看次数

JSTL/EL中的三元运算符

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.E​​LException:错误解析:$ {空值?'无':值}

那么为什么会这样呢?


我正在使用该JSTL 1.1库,包含以下taglib,

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Run Code Online (Sandbox Code Playgroud)

jsp jstl el ternary-operator conditional-operator

41
推荐指数
1
解决办法
7万
查看次数

为什么三元运算符意外地转换整数?

我已经看到它在某处讨论过以下代码导致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,类型objInteger理所应当的.

Object obj = true ? new Integer(200) : new BigDecimal(0.0);

System.out.println(obj);
Run Code Online (Sandbox Code Playgroud)

结果:200


我认为这样做的原因是将左侧投射到a/与比较和计算double相同的方式,但这里左右两侧不会以这种方式相互作用.integerdouble

为什么会这样?

java casting ternary-operator conditional-operator

40
推荐指数
1
解决办法
3062
查看次数

带有空第二个参数的C条件运算符('?')

通常是'?' 运算符以下列形式使用:

A ? B : C
Run Code Online (Sandbox Code Playgroud)

然而,在B = AI的情况下,已经看到以下缩写

A ? : C
Run Code Online (Sandbox Code Playgroud)

这令人惊讶地起作用.是否更好地保留第二个参数(样式方式),或者某些编译器是否有机会无法处理它?

c conditional operators ternary-operator

39
推荐指数
2
解决办法
1万
查看次数

仅在JavaScript中的三元运算符中条件为true时分配

是否可以在JavaScript中执行此类操作?

max = (max < b) ? b;
Run Code Online (Sandbox Code Playgroud)

换句话说,仅在条件为真时指定值.如果条件为假,则不执行任何操作(无分配).这可能吗?

javascript ternary-operator

39
推荐指数
4
解决办法
6万
查看次数

优化三元运算符

我遇到了其他人写的代码.推荐使用条件运算符还是常用?我觉得它不太可维护 - 或者只是我?有没有其他的写作方式?

  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)

c++ ternary-operator conditional-operator

39
推荐指数
4
解决办法
3071
查看次数

?:将一个表达式留空时的三元条件运算符行为

我正在编写一个控制台应用程序,试图通过反复试验来"猜测"一个数字,它工作得很好,除了它让我想知道某个部分是我心不在焉地写的,

代码是:

#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),它会工作,它似乎工作正常但是有离开的风险条件空的那部分?

c ternary-operator conditional-operator ternary

37
推荐指数
2
解决办法
1万
查看次数

三元运算符左侧相关性

在PHP手册中,我在"操作员"下找到以下"用户提供的注释 ".

请注意,在php中,三元运算符?:具有左关联性,与C和C++不同,它具有正确的关联性.

你不能编写这样的代码(正如你在C/C++中习惯的那样):

<?php 
$a = 2; 
echo ( 
    $a == 1 ? 'one' : 
    $a == 2 ? 'two' : 
    $a == 3 ? 'three' : 
    $a == 4 ? 'four' : 'other'); 
echo "\n"; 
// prints 'four' 
Run Code Online (Sandbox Code Playgroud)

我实际上尝试它,它真的打印four.但是,我无法理解它背后的原因,仍然觉得它应该打印twoother.

有人可以解释一下这里发生了什么,为什么打印'四'?

php ternary-operator associativity

37
推荐指数
3
解决办法
8369
查看次数