什么是问号“?”和冒号“:”运算符用于? [复制]
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 谢谢,我更新了答案。 性能有什么不同吗?我个人觉得经典版本更容易阅读 - 特别是当x
和 y
再次是函数调用时。
@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 < else return /r"
【讨论】:
以上是关于什么是问号“?”和冒号“:”运算符用于? [复制]的主要内容,如果未能解决你的问题,请参考以下文章