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

我正在编写一个控制台应用程序,该应用程序尝试通过反复试验来“猜测”一个数字,它运行良好,并且所有操作都使我想知道我心不在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, code

a=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),则将条件部分保留为空,这似乎可以正常工作,但存在离开的任何风险有条件的那部分是空的?


狐的传说
浏览 960回答 3
3回答

天涯尽头无女友

这是GNU C扩展名(请参阅?:Wikipedia entry),因此为了可移植性,您应明确声明第二个操作数。在“ true”的情况下,它将返回条件的结果。以下语句几乎是等效的:a = x ?: y;a = x ? x : y;唯一的区别是第一个语句x始终被评估一次,而第二个语句x如果为真则将被评估两次。因此,唯一的区别是评估x有副作用。无论哪种方式,我都认为这是语法的微妙用法……如果您对那些维护代码的人有同理心,则应该明确声明操作数。:)另一方面,对于常见的用例来说,这是一个不错的小技巧。

侃侃尔雅

这是C语言的GCC扩展。如果之间没有任何显示?:,则在真实情况下使用比较的值。条件表达式中的中间操作数可以省略。然后,如果第一个操作数不为零,则其值为条件表达式的值。因此,表达&nbsp; &nbsp; x ? : y如果x的值非零,则为x;否则,y的值。这个例子完全相当于&nbsp; &nbsp; x ? x : y在这种简单情况下,忽略中间操作数的功能不是特别有用。当第一个操作数确实有用或可能(如果它是宏参数)包含副作用时,它才变得有用。然后在中间重复操作数将产生两次副作用。省略中间操作数将使用已经计算的值,而不会产生重新计算该值的不良影响。
打开App,查看更多内容
随时随地看视频慕课网APP