为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2019-11-02 11:05:43
我正在编写一个控制台应用程序,该应用程序尝试通过反复试验来“猜测”一个数字,它运行良好,并且所有操作都使我想知道我心不在part地写的某个部分,代码是:#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, codea=a-((100/(i<<=1))?:1);我曾经((100/(i<<=1))?:1)确保如果100/(i<<=1)返回0(或false),则整个表达式的计算结果将为1 ((100/(i<<=1))?:***1***),如果条件为true ((100/(i<<=1))?  _this space_    :1),则将条件部分保留为空,这似乎可以正常工作,但存在离开的任何风险有条件的那部分是空的?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

这是GNU C扩展名(请参阅?:Wikipedia entry),因此为了可移植性,您应明确声明第二个操作数。


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


以下语句几乎是等效的:


a = x ?: y;

a = x ? x : y;

唯一的区别是第一个语句x始终被评估一次,而第二个语句x如果为真则将被评估两次。因此,唯一的区别是评估x有副作用。


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


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


查看完整回答
反对 回复 2019-11-02
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

这是C语言的GCC扩展。如果之间没有任何显示?:,则在真实情况下使用比较的值。


条件表达式中的中间操作数可以省略。然后,如果第一个操作数不为零,则其值为条件表达式的值。


因此,表达


    x ? : y


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


这个例子完全相当于


    x ? x : y


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


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 956 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信