什么是问号“?”和冒号“:”运算符用于? [复制]

Posted

技术标签:

【中文标题】什么是问号“?”和冒号“:”运算符用于? [复制]【英文标题】: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 的。 【参考方案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"

【讨论】:

以上是关于什么是问号“?”和冒号“:”运算符用于? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中":"(冒号)和问号是啥意思

Ruby问号运算符,这是啥意思? [复制]

c语言中" : "(冒号)和问号是啥意思

C语言中的冒号(:)是啥意思?

C三目运算符(先是问号之后又是冒号的那个)

C语言里两个冒号是啥意思?