我想在一行(C编程语言)中执行此操作:
int x = index >> 8;
int y = x < 10 ? x+1 : x+2;
有可能吗?我之前如何参考价值?签名,如果我没有将它存储在单独的整数中?
"int y = (index >> 8) < 10 ? [what]+1 : [what]+2;"
答案 0 :(得分:2)
您只需要重复表达式:
int y = (index >> 8) < 10 ? (index >> 8) + 1 : (index >> 8) + 2;
它不是很好,也不是可读的,所以我不明白为什么你必须这样做。在?
之前,语言中没有内置的方式来引用表达式。由于表达式在C中可能有副作用,如果存在,则会非常毛茸茸。
答案 1 :(得分:1)
你拥有这个表达式的方式是最好的,你可以在没有代码重复的情况下到达那里。 如果您绝对需要它是一个单独的字符串,您可以简单地执行以下操作:
int y = (index >> 8) < 10 ? (index >> 8)+1 : (index >> 8)+2;
答案 2 :(得分:1)
因为C不区分空格字符,所以可以将它放在一行中:
int x = index >> 8; int y = x < 10 ? x+1 : x+2;
......这是完全有效的C.
但是,您的y
和x
值不是相互依赖的,因此您可以将表达式简化为y
:
int y = index >> 8; y = y < 10 ? y+1 : y+2;
如果您的y
已经存在,您可以使用很少使用的逗号运算符来消除分号并将其减少为单个语句:
y = ( y = index >> 8 ), y < 10 ? y+1 : y+2;
请注意,您不能在值声明语句中使用逗号运算符,因为在该上下文中它将成为序列分隔符。
答案 3 :(得分:1)
尝试以这种方式优化源代码通常没有用。 C没有规定计算机必须执行的具体操作; C指定程序必须达到的结果。 (通过C中的“as if”模型。编译器生成的程序必须产生结果,就像您逐步完成您编写的特定操作一样,但这些结果实际上可以通过实现选择的任何指令序列获得。只需要重现结果,而不是机制。)
通常,您应该编写清楚的代码,并且应该允许编译器中的优化器有效地执行计算。
答案 4 :(得分:0)
或者,通过去除三元组。该移位相当于除以256,我们也可以在移位前比较该值。
int y = (index >> 8) + 1 + (index >= 2560);
当然,索引应该是正面的。
编辑:该表达式还具有无临时写访问权限和无序列点的优点。
答案 5 :(得分:0)
可以使用此表格:
int y = (y = index >> 8) < 10 ? y+1 : y+2;
在这里,y被赋予索引的临时值&gt;&gt; 8,所以你可以重用那个值后的?操作
与David的类似答案相反,此表单也在值声明声明中起作用。