【问题标题】:What is a Question Mark "?" and Colon ":" Operator Used for? [duplicate]什么是问号“?”和冒号“:”运算符用于? [复制]
【发布时间】:2012-05-07 09:23:13
【问题描述】:

关于使用问号“?”的两个问题和冒号“:”运算符在打印函数的括号内:它们做什么?另外,有谁知道它们的标准术语,或者我可以在哪里找到有关它们使用的更多信息?我读过它们类似于 'if' 'else' 语句。

int row = 10;
int column;
while (row >= 1)
{
    column = 1;
    while(column <= 10)
    {
        System.out.print(row % 2 == 1 ? "<" : "\r>");
        ++column;
    }
    --row;
    System.out.println();
}

【问题讨论】:

  • 仅供参考:三元运算符不是特定于 java 的。

标签: java operators ternary-operator conditional-operator


【解决方案1】:

这是ternary conditional operator,可以在任何地方使用,而不仅仅是打印语句。它有时被称为“三元运算符”,但it's not the only ternary operator,只是最常见的一种。

这是一个来自 Wikipedia 的很好的例子,展示了它是如何工作的:

用 C、Java 和 JavaScript 编写了一个传统的 if-else 结构:

if (a > b) {
    result = x;
} else {
    result = y;
}

这可以重写为以下语句:

result = a > b ? x : y;

基本上它采用以下形式:

boolean statement ? true result : false result;

因此,如果布尔语句为真,则得到第一部分,如果为假,则得到第二部分。

如果仍然没有意义,试试这些:

System.out.println(true ? "true!" : "false.");
System.out.println(false ? "true!" : "false.");

【讨论】:

  • 三元运算符是指任何具有三个参数的运算符,因此这是a三元运算符,而不是三元运算符。主要语言(C#、Java、PHP)将其视为 a 条件运算符,并将其称为 the ?: 运算符。偶尔 (JavaScript) 它被称为 条件运算符。
  • @Sheepy 谢谢,我更新了答案。
  • 性能有什么不同吗?我个人觉得经典版本更容易阅读 - 特别是当 xy 再次是函数调用时。
  • @Cleb 理论上没有区别,但是编译器可能会以不同的方式优化这两个语句(对分支预测做出不同的假设)。大多数人不需要担心这种优化级别,如果你这样做了,你可能还是想使用像__builtin_expect 这样的属性。
【解决方案2】:

这是一个等效于的 if/else 语句

if(row % 2 == 1){
  System.out.print("<");
}else{
  System.out.print("\r>");
}

【讨论】:

    【解决方案3】:
    a=1;
    b=2;
    
    x=3;
    y=4;
    
    answer = a > b ? x : y;
    

    answer=4 因为条件为假,所以需要 y 值。

    问号 (?)
    .条件为真时使用的值

    冒号 (:)
    .条件为假时使用的值

    【讨论】:

    • 对我来说,根据你的布局,你的答案是唯一有意义的。所以谢谢你,我已经引用了你的答案。 garrett.ms/2019/07/24/…
    【解决方案4】:

    虽然我会发布我遇到的另一个相关问题的答案,

    a = x ? : y;
    

    相当于:

    a = x ? x : y;
    

    如果 x 为 false 或 null,则取 y 的值。

    【讨论】:

    • 什么语言?不在 Java 中。
    • 在java中可以但不能。
    • 我正在使用 Java,是的,这确实有效。
    • 抱歉,这在 Java 中不起作用。你确定你不是在考虑 PHP 吗?
    • Groovy 的“Elvis 运算符”(?:) 的行为类似于 C# 的空值合并运算符 (??)。
    【解决方案5】:

    也许它可以成为 Android 的完美示例, 例如:

    void setWaitScreen(boolean set) {
        findViewById(R.id.screen_main).setVisibility(
                set ? View.GONE : View.VISIBLE);
        findViewById(R.id.screen_wait).setVisibility(
                set ? View.VISIBLE : View.GONE);
    }
    

    【讨论】:

      【解决方案6】:

      它们被称为三元运算符,因为它们是Java 中唯一的一种。

      if...else 构造的不同之处在于,它们返回一些东西,而这个东西可以是任何东西:

        int k = a > b ? 7 : 8; 
        String s = (foobar.isEmpty ()) ? "empty" : foobar.toString (); 
      

      【讨论】:

      • 是否可以在 7 或 8 之后调用函数?例如如果 a>7 type 7 然后执行其他函数。
      • 你的意思是“print 7”和“type 7”吗?你为什么不试试看? Java 行话使用表达式方法,而不是函数 - 在其他上下文中,函数和过程有区别,这取决于返回类型的存在,而这在三元表达式中是必需的。 Afaik,您可以调用一个函数,该函数在打印后返回一个值。
      【解决方案7】:

      它是一个三元运算符,用简单的英文表示"if row%2 is equal to 1 then return &lt; else return /r"

      【讨论】:

        猜你喜欢
        • 2012-09-25
        • 2011-02-05
        • 2011-09-14
        • 1970-01-01
        • 2011-01-24
        相关资源
        最近更新 更多