?:将一个表达式留空时的三元条件运算符行为

Posted

技术标签:

【中文标题】?:将一个表达式留空时的三元条件运算符行为【英文标题】:?: ternary conditional operator behaviour when leaving one expression empty 【发布时间】:2011-03-20 03:28:10 【问题描述】:

我正在编写一个控制台应用程序,它会尝试通过反复试验“猜测”一个数字,它运行良好,但它让我想知道我心不在焉地写的某个部分,

代码是:

#include <stdio.h>
#include <stdlib.h>

int main()

    int x,i,a,cc;
    for(;;)
    scanf("%d",&x);
    a=50;
    i=100/a;
for(cc=0;;cc++)

    if(x<a)
    
        printf("%d was too big\n",a);
        a=a-((100/(i<<=1))?:1);

    
    else if (x>a)
    
        printf("%d was too small\n",a);
        a=a+((100/(i<<=1))?:1);

    
    else
    
        printf("%d was the right number\n-----------------%d---------------------\n",a,cc);
        break;
    


return 0;

更具体地说,让我感到困惑的部分是

a=a+((100/(i<<=1))?:1); 
//Code, code
a=a-((100/(i<<=1))?:1);

我使用((100/(i&lt;&lt;=1))?:1) 来确保如果100/(i&lt;&lt;=1) 返回 0(或 false),则整个表达式的计算结果将是 1 ((100/(i&lt;&lt;=1))?:***1***),并且我将条件的一部分留给如果它为 true 则可以工作的部分为空 @ 987654327@,它似乎可以正常工作,但是将条件的那部分留空有什么风险吗?

【问题讨论】:

这种类型的条件称为三元运算。如果您重新标记或重新命名帖子以包含“三元”,您可能会得到更好的回应。 en.wikipedia.org/wiki/%3F:">This</a> 链接,C 变体部分 @Segphault:它被称为 the 条件运算符(在 C 中)。这是 a 三元运算符的一个示例,它是一个通用术语,表示具有三个操作数的任何运算符。 如果您有疑问,这导致了这个问题,毫无疑问,您应该明确指定真实案例。 TooBored....考虑不要编写愚蠢的控制台游戏,因为它是一个积极的无聊反馈器。 @JeremyP:是的,“三元运算符”是具有三个操作数的运算符的通用术语。但是“条件运算符”(?:)恰好是 C(以及许多类似语言)中的 only 三元运算符,因此它通常被称为“the 三元运算符”。用法可能有点草率,但很常见。 (C 标准从不将?: 称为“三元”运算符。事实上,它仅在讨论fma() 函数的语义时才使用“三元运算符”一词,该函数计算(x × y) + z。) 【参考方案1】:

这是一个 GNU C 扩展(参见 ?: wikipedia entry),因此为了可移植性,您应该明确说明第二个操作数。

在“真”的情况下,它返回条件的结果。

以下语句几乎是等价的:

a = x ?: y;
a = x ? x : y;

唯一的区别是在第一个语句中,x 总是被评估一次,而在第二个语句中,x 将被评估两次,如果它是真的。所以唯一的区别是在评估 x 时有副作用。

无论哪种方式,我都认为这是对语法的一种微妙使用……如果您对维护您的代码的人有任何同理心,您应该明确说明操作数。 :)

另一方面,对于常见用例来说,这是一个不错的小技巧。

【讨论】:

几乎等价...除了xx ?: y 中只评估一次。 @KennyTM:是的,我应该明确说明这一点。 我在 xlc(IBM XL C/C++ for AIX,V11.1)上尝试了这种三元语法,但它缺少第二个操作数,它也有效。 我知道一些项目虽然使用“?:”,但似乎经过了高度可移植性测试。有没有编译器不工作的例子?【参考方案2】:

这是 C 语言的GCC extension。当?:之间没有出现任何内容时,则在true情况下使用比较的值。

条件表达式中的中间操作数可以省略。那么如果第一个操作数不为零,那么它的值就是条件表达式的值。

因此,表达式

    x ? : y

如果 x 不为零,则其值为 x;否则,y的值。

这个例子完全等价于

    x ? x : y

在这种简单的情况下,省略中间操作数的能力并不是特别有用。当它变得有用时,第一个操作数确实或可能(如果它是宏参数)包含副作用。然后在中间重复操作数将执行两次副作用。省略中间操作数会使用已经计算的值,而不会产生重新计算的不良影响。

【讨论】:

哈,“完全等价”。当然,如果你忽略差异,一切都是完全等价的...... 在这种简单的情况下确实是完全等价的。 它也适用于 Clang,而不仅仅是 GCC。

以上是关于?:将一个表达式留空时的三元条件运算符行为的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符

python 三元运算

FizzBu​​zz 使用三元条件运算符

三元运算符

python条件(三元)运算符

三元运算符