我一直在与Java几年,但直到最近我都没穿过这个结构:

int count = isHere ? getHereCount(index) : getAwayCount(index);

这可能是一个非常简单的问题,但是有人可以解释一下吗?我怎么读?我很确定我知道它是如何工作的。

  • 如果 isHere 是真的, getHereCount() 是叫,
  • 如果 isHere 是假的 getAwayCount() 被称为。

正确的吗?这是什么造?

有帮助吗?

解决方案

是的,这是一种形式

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

这就是所谓的 有条件的操作者.许多人(错误地)称呼它 三元的操作者, 因为这是唯一的三元(三个参数)经营者在Java、C、C++、和许多其他语言。但理论上有 可能 被另一个三元的操作者,而只能有一个 有条件的操作者.

正式名称是 Java语言规范:

§15.25有条件的操作者?:

有条件的操作者 ? : 用布尔价值的一种表达式决定其中的两个其他表现形式应该进行评估。

注意,这两个分支机构必须导致方法与返回的价值观:

这是一个编译错误的时间为第二个或第三个操作数的表达可以调用的一个空白的方法。

事实上,通过语法的表达的陈述(§14.8),这是不允许使用的条件式出现在任何情况下调用的一个空白的方法可能出现。

因此,如果 doSomething()doSomethingElse() 都是无效的方法,你无法压缩这样的:

if (someBool)
    doSomething();
else
    doSomethingElse();

到这个:

someBool ? doSomething() : doSomethingElse();

简单的话:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

其他提示

其他人已经回答了这个合理的程度,但是通常的名称"三元经营者"。

是书呆子,我,我还想清楚地表明,该名称的经营者是有条件的操作者或"有条件的操作者?:".它的 一个 三操作员(在于,它具有三个操作数),它会发生是唯一的三操作员在Java的时刻。

但是, 规范是非常清楚 它的名称是有条件的操作者或"有条件的操作者?:" 必须绝对明确的。我认为这是更清楚管它叫这个名字,因为它指示的行为操作者一定程度上(评估的一个条件)而不仅仅是多少操作数。

根据 太阳Java规范, 这叫有条件的操作员。见第15.25.你是对的因为它做什么。

有条件的操作者?:用布尔价值的一种表达式决定其中的两个其他表现形式应该进行评估。

有条件的操作人员在语法正确相联(它组右到左的),以使一个?b:c?d:e?f:克的装置相同?b:(c?d:(e?f:g))。

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

有条件的操作员有三个操作数表达式;?出现第一和第二之间的表现,并且:之间出现的第二和第三的表达。

第一次表达必须的类型布尔或布尔,或编制时发生错误。

不完全正确的,准确地说:

  1. 如果isHere是真实的, 结果, 的getHereCount()是 返回
  2. otheriwse的 结果, 的getAwayCount()是 返回

那个"返回"是非常重要的。这意味着方法 必须 返回的价值和价值 必须 被指派的地方。

此外,它的 不完全是 在语法上相当于如果其他版本。例如:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

如果编码,如果其他总是会导致更多码。

int count = isHere ? getHereCount(index) : getAwayCount(index);

意味着:

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

如果条件是 true 然后返回第一个参数。如果条件是 false, 返回第二个参数。

这就是所谓的 有条件的操作者 它是一种类型的 三操作.

三、有条件;番茄,制定.什么这真的很有价值是可变的初始化。如果(像我一样)你喜欢的初始化的变量,在它们的定义,有条件的三操作员(因为这是两)允许你这样做的情况下,有条件的有关其价值。特别值得注意的是在最后的领域,而有用的其他地方。

例如:

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

没有这种操作员-任何名字-你要做的领域的非最终的,或者编写一个功能,只需初始化。 实际上,那是不对的,它仍可被初始化使用如果/则,至少在Java。但我找到这个吸尘器。

这种结构是所谓 三操作员 在计算机科学和编程技术。
维基百科 建议以下解释:

在计算机科学中,三元的操作者(有时错误地称为一个三级运营商)是一个操作者的需要的三个参数。该论据和结果可能是不同的类型。许多编程语言,使用C-等语法,设有一个三元的操作者,?:,其限定条件式。

不仅在爪哇,这种语法是提供内PHP,目标-C。

在下面的 链接 它提供了以下解释,这是安静的良好的理解:

一个三元的操作者是一些操作,操作月3的投入。这是一个快捷方式对于如果其他语句,以及也被称为有条件的操作员。

在Perl/PHP它的工作为:
boolean_condition ? true_value : false_value

在C/C++它的工作为:
logical expression ? action for true : action for false

这可能是可读的,对于一些逻辑的条件,这是不是太复杂,否则最好是使用 如果其他块 与旨在结合条件的逻辑。

我们可以简化 如果其他块 与这三元的操作者的一个代码的发言行。
例如:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

可能是平等的以下内容:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

因此,如果我们指的是你的声明:

int count = isHere ? getHereCount(index) : getAwayCount(index);

它实际上是100%等同于以下的 如果其他块:

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

这就是它!
希望这有助于人!
干杯!

正确的。它的 三操作员.一些还呼它的 有条件的操作者.

其三操作员(?:)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.

你可能会感兴趣 提案 对于一些新的运营,类似于有条件的操作员。空安全的运营商将使这样的代码:

String s = mayBeNull?.toString() ?: "null";

它将特别是方便其自动拆箱需要的地方。

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

它已 选择用于进一步审议 在JAVA7的"项目硬币。"

实际上它可能需要超过3的论点。例如,如果我们想要检查是否有一些是积极的、消极的或零,我们可以这样做:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

这是比使用如果其他的如果是其他。

它是有条件的操作者,它不仅仅是一个简明的写作方式,如果报表。

因为它是一个表达返回价值,它可以被用作一部分的其他表达方式。

是的,你是正确的。?:通常被称为"三条件操作员",通常称为简单的"三元经营者"。这是一个简写版本的标准如果其他条件。

三条件操作员

我真的很喜欢这个操作员,但是读者应该得到考虑。

你总是有平衡的代码紧凑的时间花在阅读它,在于它具有一些相当严重的缺陷。

首先,有的是原始提问者的情况。他刚刚花了一个小时发布关于它和阅读的反应。如何长将它已经采取了提交人写每?:如果那的整个过程中他的整个生活。不到一小时,以确保。

其次,在C-喜欢的语言,你得习惯的仅仅知道,条件是第一件事在线。我注意到这个当我还是使用红宝石和遇到了线路,如:

callMethodWhatever(Long + Expression + with + syntax) if conditional

如果我是一个很长一段时间,红宝石户我可能不会有一个问题与这条线,但是来自C,当你看到"callMethodWhatever"作为第一件事就行了,你期望它执行的。的?:小神秘,但仍然不寻常的足够扔一个读者了。

优点,但是,是真的凉爽的感觉在你的肚子的时候你可以写一个3-如果声明在1线.不能否认:)但老实说,不一定是更多的可读通过的90%的人在那里仅仅是因为其罕见的。

当它是真正的分配的基础上布尔和价值观,我不要有这一个问题,但它可以很容易被滥用。

条件式正在一个完全不同的风格,没有明确如果在声明。

法是:boolean expression?1:2;

结果这种条件表达的是

1如果布尔-表达的真实;

否则结果是2.

假设你要分配更多的变量num1和num2。你可以简单地写一份声明使用的条件式:max=(num1>num2)?num1:num2;

注:符号?并且:一起出现在一个有条件的表达。它们形成一个有条件的操作者,也称为一个三元操作,因为它使用的三个操作数。它是唯一的三元的操作员。

引自:介绍Java编第10版,由Y.丹尼尔良页126-127

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top