标签: ternary-operator

Java中使用盒装类型的三元条件的奇怪行为

我在我的应用程序中使用了这段代码(简化版):

Object result;
if (check)
    result = new Integer(1);
else
    result = new Double(1.0);
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)

然后我决定将if-else语句重构为三元条件表达式,因此我的代码更简洁:

Object result = check ? new Integer(1) : new Double(1.0);
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)

原来,如果检查是true两个版本打印不同的结果:

1
Run Code Online (Sandbox Code Playgroud)

要么:

1.0
Run Code Online (Sandbox Code Playgroud)

三元条件不等于相应的if-else吗?

java ternary-operator

23
推荐指数
2
解决办法
626
查看次数

Java - 三元运算符奇怪的行为

我试图fractional从一个double整体使用的部分中删除该部分:

(d % 1) == 0 ? d.intValue() : d
Run Code Online (Sandbox Code Playgroud)

并遇到以下我不明白的行为:

public static void main(String[] args) {
    Double d = 5D;
    System.out.println((d % 1) == 0);                               // true
    System.out.println((d % 1) == 0 ? d.intValue() : "not whole");  // 5
    System.out.println((d % 1) == 0 ? d.intValue() : d);            // 5.0
}
Run Code Online (Sandbox Code Playgroud)

正如您在第三行所看到的,操作员选择该else值 - 5.0即使(d % 1) == 0满足条件.

这里发生了什么?

java double ternary-operator

23
推荐指数
2
解决办法
1559
查看次数

有条件地分配PHP值

对于基于表达式结果为变量赋值的常见情况,我是三元运算符的粉丝:

$foo = $bar ? $a : b;
Run Code Online (Sandbox Code Playgroud)

但是,如果$ bar是一个相对昂贵的操作,并且如果结果是真的,我想将$ bar的结果赋给$ foo,这是低效的:

$foo = SomeClass::bigQuery() ? SomeClass::bigQuery() : new EmptySet();
Run Code Online (Sandbox Code Playgroud)

一种选择是:

$foo = ($result = SomeClass::bigQuery()) ? $result : new EmptySet();
Run Code Online (Sandbox Code Playgroud)

但我宁愿没有额外$result的记忆.

我得到的最好选择是:

$foo = ($foo = SomeClass::bigQuery()) ? $foo : new EmptySet();
Run Code Online (Sandbox Code Playgroud)

或者,没有三元运算符:

if(!$foo = SomeClass::bigQuery()) $foo = new EmptySet();
Run Code Online (Sandbox Code Playgroud)

或者,如果程序流操作符不是您的风格:

($foo = SomeClass::bigQuery()) || ($foo = new EmptySet());
Run Code Online (Sandbox Code Playgroud)

这么多选择,非他们真的令人满意.你会使用哪种,我错过了一些非常明显的东西?

php ternary-operator

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

在JasperReports中进行比较

我想做一个比较,如:

if <field> == 0 then "-"
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我使用JasperReports的语法吗?

jasper-reports ternary-operator

22
推荐指数
2
解决办法
9万
查看次数

Java三元没有分配

有没有办法在没有做任务的情况下进行java三元操作或假冒伪造?

我喜欢在做一堆if/then/elses时简洁的三元代码看起来如何.

我希望能够基于布尔代数语句调用两个void函数之一.

就像是:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

我的函数是返回类型void,所以如果有一种方法可以在赋值中伪造它以使其工作,那么我对此没问题......我想看看如何做到这一点:)

java ternary-operator ternary

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

为什么三元运算符中的逗号会在JavaScript中引发语法错误?

当我尝试在条件(三元)运算符中使用逗号运算符进行日志记录时,我注意到了一些奇怪的事情.这是一个人为的例子:

const a = 2;
const b = 1;
a > b ? console.log(a), a : b; //I expect this to log and evaluate to a
Run Code Online (Sandbox Code Playgroud)

但相反,我遇到了这个:

Uncaught SyntaxError: Unexpected token ,
Run Code Online (Sandbox Code Playgroud)

根据MDN文档,条件运算符接受两个表达式作为三元运算符的"if"和"else"情况,而逗号运算符理论上是表达式,

逗号运算符计算其每个操作数(从左到右)并返回最后一个操作数的值.

那我为什么会出现语法错误?逗号运算符是一个表达式,应该允许它在条件运算符中.虽然,在逗号的操作数周围加括号可以正常工作:

a > b ? (console.log(a), a) : b; //Logs and gives a
Run Code Online (Sandbox Code Playgroud)

为什么这样可行?圆括号(或分组运算符)允许解释者知道它在处理一个表达式,但console.log(a), a已经无需括号的表达,所以为什么我得到一个语法错误,没有他们?

javascript ternary-operator syntax-error language-lawyer ecmascript-6

22
推荐指数
1
解决办法
1008
查看次数

为什么三元运算符不像有边界通配符的泛型类型?

以下类定义了两种方法,两种方法都直观地具有相同的功能.使用两个类型列表List<? super Integer>和一个布尔值调用每个函数,该值指定应将哪些列表分配给局部变量.

import java.util.List;

class Example {
    void chooseList1(boolean choice, List<? super Integer> list1, List<? super Integer> list2) {
        List<? super Integer> list;

        if (choice)
            list = list1;
        else
            list = list2;
    }

    void chooseList2(boolean choice, List<? super Integer> list1, List<? super Integer> list2) {
        List<? super Integer> list = choice ? list1 : list2;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据javac 1.7.0_45,chooseList1有效而chooseList2不是.它抱怨说:

java: incompatible types
  required: java.util.List<? super java.lang.Integer>
  found:    java.util.List<capture#1 of ? extends …
Run Code Online (Sandbox Code Playgroud)

java generics ternary-operator bounded-wildcard

21
推荐指数
1
解决办法
971
查看次数

三元表达式有时会绕过编译器检查验证

出于某种原因,以下代码正常编译:

public double getSomeDouble() {
    return "" != null ? 3.7d : null;
}
Run Code Online (Sandbox Code Playgroud)

我通常希望Eclipse将其标记为错误(null不能转换为double原语).

只是为了支持我的假设,这段代码不起作用:

public double getSomeDouble() {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

Eclipse会将该return null行标记为错误,说明:

类型不匹配:无法转换nulldouble

为什么它在前面的代码片段中没有说同样的东西?!

java eclipse expression compilation ternary-operator

21
推荐指数
1
解决办法
671
查看次数

为什么可以(false?A():B()).test()仅在A和B具有子类关系时编译?

本来我喜欢用这样的东西:

(true?a:b).test()
Run Code Online (Sandbox Code Playgroud)

代替

(true?a.test():b.test())
Run Code Online (Sandbox Code Playgroud)

如果函数具有相同的名称,为了节省打字时间,最初我认为它应该是有效的,但我发现:

#include <stdio.h>
class A{
public:
    char test(){
        return 'A';
    }
};

class B{
public:
    char test(){
        return 'B';
    }
};

int main(){
    printf("%c\n",(false?A():B()).test());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

无法编译,但如果B是子类A:

#include <stdio.h>
class A{
public:
    char test(){
        return 'A';
    }
};

class B : public A{
public:
    char test(){
        return 'B';
    }
};

int main(){
    printf("%c\n",(false?A():B()).test());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它可以编译,为什么?

c++ syntax inheritance ternary-operator

21
推荐指数
2
解决办法
1712
查看次数

"?:"发生了什么?我不知道返回类型

我认为((1 ? (int)1 : (unsigned int)2) > -1)结果是1(true),但实际上它0在Visual Studio 2017中是(假的).

我认为价值(1 ? (int)1 : (unsigned int)2)应该是(int)1,因为1 ?是真的,而且1 > -1是真的.

我不知道为什么这个表达式的最终结果是错误的.

当我尝试转换时((int)(1 ? (int)1 : (unsigned int)2) > -1),它返回1(true).

signed int test = -1;
signed int si = 1;
unsigned int ui = 2;

printf("%d\n", ((1 ? si : ui) > test));
return 0;
Run Code Online (Sandbox Code Playgroud)

我希望输出是1,但实际输出是0.

c unsigned signed ternary-operator conditional-operator

19
推荐指数
1
解决办法
1173
查看次数