标签: conditional-operator

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

我已经看到它在某处讨论过以下代码导致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#中的运算符?

我最近发现我们可以使用?? 运算符检查空值.请检查以下代码示例:

   var res = data ?? new data();
Run Code Online (Sandbox Code Playgroud)

这与之完全相似

   var res = (data==null) ? new data() : data ;
Run Code Online (Sandbox Code Playgroud)

我检查了我的整个项目源代码库和一些其他开源项目.这个??操作员从未使用过.

我只是想知道这背后有什么理由,比如性能问题还是什么?

编辑:

我刚刚根据recursive和Anton的评论更新了我的示例代码.粗心大意是一个错误.:(

c# conditional-operator

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

为什么不使用三元运算符而不为"true"条件赋值(x = x?:1)

在Android开源qemu代码中,我遇到了这行代码:

machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
Run Code Online (Sandbox Code Playgroud)

这只是一种令人困惑的说法:

if (machine->max_cpus) {
   ; //do nothing
} else {
 machine->max_cpus = 1;
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,那就不会更清楚了:

if (machine->max_cpus == 0) machine->max_cpus = 1;
Run Code Online (Sandbox Code Playgroud)

有趣的是,这可以编译并与gcc一起使用,但不能在http://www.comeaucomputing.com/tryitout/上编译.

c gcc qemu conditional-operator android-emulator

39
推荐指数
3
解决办法
6569
查看次数

优化三元运算符

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

  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
查看次数

三元运算符为什么以及何时返回左值?

很长一段时间以来,我认为三元运算符总是返回一个右值.但令我惊讶的是,事实并非如此.在下面的代码中,我没有看到返回值foo和三元运算符的返回值之间的区别.

#include <iostream>
int g = 20 ;

int foo()
{
    return g ;
}

int main()
{
    int i= 2,j =10 ;

    foo()=10 ; // not Ok 
    ((i < 3) ? i : j) = 7; //Ok
    std::cout << i <<","<<j << "," <<g << std::endl ;
}
Run Code Online (Sandbox Code Playgroud)

c++ rvalue conditional-operator lvalue

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

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

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

代码是:

#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万
查看次数

这个三元有条件吗?:正确(Objective)C语法?

我不认为这是可能的,但显然在Objective C中允许:

int a = b ?: c;
Run Code Online (Sandbox Code Playgroud)

所以你看到他们在这里做的是什么,他们忽略了三元表达式的第二部分,这样如果b非零,则b用作第二部分.

它很聪明但据我所知这是针对K&R C,可能是ANSI C.

如果没有,多年来我一直错过了一个非常聪明的语法技巧......唉!

更新:这是gcc.

c objective-c ternary-operator conditional-operator

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

Java条件运算符?:结果类型

我对条件运算符有点疑惑.请考虑以下两行:

Float f1 = false? 1.0f: null;
Float f2 = false? 1.0f: false? 1.0f: null;
Run Code Online (Sandbox Code Playgroud)

为什么f1变为null而第二个语句抛出NullPointerException?

Langspec-3.0 para 15.25 sais:

否则,第二和第三操作数分别是S1和S2类型.设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型.条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果.

所以对于false?1.0f:nullT1是Float而T2是null类型.但结果是lub(T1,T2)什么?第15.12.2.7段只是有点太多了......

顺便说一句,我在Windows上使用1.6.0_18.

PS:我知道Float f2 = false? (Float) 1.0f: false? (Float) 1.0f: null;不会抛出NPE.

java type-conversion nullpointerexception conditional-operator

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

为什么条件运算符是正确关联的?

我可以理解为什么赋值运算符是正确关联的.什么时候才有意义

x = 4 + 3
Run Code Online (Sandbox Code Playgroud)

评估,在分配给x之前添加4和3.

我不清楚如何?:从正确的联想中获益.只有两个?:人像这样使用才有意义

z = (a == b ? a : b ? c : d);
Run Code Online (Sandbox Code Playgroud)

然后它被评估如下:

z = (a == b ? a : (b ? c : d));
Run Code Online (Sandbox Code Playgroud)

从左到右进行评估肯定会更有意义吗?

c conditional-operator

35
推荐指数
3
解决办法
1万
查看次数

Javascript &&运算符与嵌套if语句:什么更快?

现在,在你们全都跳过我并说"你们过分担心表演"之前,请说明一点,我更多地出于好奇而不是过分夸大的性质.那说......

我很好奇是否使用&&("和")运算符和嵌套if语句之间存在性能差异.此外,是否存在实际的处理差异?即,&& 总是处理两个语句,或者如果第一个语句失败,它会停止@第一个语句吗?这与嵌套的if语句有什么不同?

要明确的例子:

A)&&("和")运算符

if(a == b && c == d) { ...perform some code fashizzle... }
Run Code Online (Sandbox Code Playgroud)

与B)嵌套的if语句

if(a == b) {
    if(c == d) { ...perform some code fashizzle... }
}
Run Code Online (Sandbox Code Playgroud)

javascript performance conditional-operator

34
推荐指数
2
解决办法
5万
查看次数