我正在编写一个控制台应用程序,该应用程序尝试通过反复试验来“猜测”一个数字,它运行良好,并且所有操作都使我想知道我心不在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有副作用。
无论哪种方式,我都认为这是语法的微妙用法……如果您对那些维护代码的人有同理心,则应该明确声明操作数。:)
另一方面,对于常见的用例来说,这是一个不错的小技巧。
侃侃尔雅
TA贡献1801条经验 获得超16个赞
这是C语言的GCC扩展。如果之间没有任何显示?:,则在真实情况下使用比较的值。
条件表达式中的中间操作数可以省略。然后,如果第一个操作数不为零,则其值为条件表达式的值。
因此,表达
x ? : y
如果x的值非零,则为x;否则,y的值。
这个例子完全相当于
x ? x : y
在这种简单情况下,忽略中间操作数的功能不是特别有用。当第一个操作数确实有用或可能(如果它是宏参数)包含副作用时,它才变得有用。然后在中间重复操作数将产生两次副作用。省略中间操作数将使用已经计算的值,而不会产生重新计算该值的不良影响。
添加回答
举报
0/150
提交
取消