我已经看到它在某处讨论过以下代码导致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
为什么会这样?
我最近发现我们可以使用?? 运算符检查空值.请检查以下代码示例:
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的评论更新了我的示例代码.粗心大意是一个错误.:(
在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/上编译.
我遇到了其他人写的代码.推荐使用条件运算符还是常用?我觉得它不太可维护 - 或者只是我?有没有其他的写作方式?
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) 很长一段时间以来,我认为三元运算符总是返回一个右值.但令我惊讶的是,事实并非如此.在下面的代码中,我没有看到返回值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) 我正在编写一个控制台应用程序,试图通过反复试验来"猜测"一个数字,它工作得很好,除了它让我想知道某个部分是我心不在焉地写的,
代码是:
#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),它会工作,它似乎工作正常但是有离开的风险条件空的那部分?
我不认为这是可能的,但显然在Objective C中允许:
int a = b ?: c;
Run Code Online (Sandbox Code Playgroud)
所以你看到他们在这里做的是什么,他们忽略了三元表达式的第二部分,这样如果b非零,则b用作第二部分.
它很聪明但据我所知这是针对K&R C,可能是ANSI C.
如果没有,多年来我一直错过了一个非常聪明的语法技巧......唉!
更新:这是gcc.
我对条件运算符有点疑惑.请考虑以下两行:
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
我可以理解为什么赋值运算符是正确关联的.什么时候才有意义
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)
从左到右进行评估肯定会更有意义吗?
现在,在你们全都跳过我并说"你们过分担心表演"之前,请说明一点,我更多地出于好奇而不是过分夸大的性质.那说......
我很好奇是否使用&&("和")运算符和嵌套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) c ×4
c++ ×2
java ×2
c# ×1
casting ×1
gcc ×1
javascript ×1
lvalue ×1
objective-c ×1
performance ×1
qemu ×1
rvalue ×1
ternary ×1