我想在一行中做到这一点(C编程语言):
int x = index >> 8;
int y = x < 10 ? x+1 : x+2;
是否可以?我如何引用之前的价值?签名,如果我没有将它存储在单独的整数中?
"int y = (index >> 8) < 10 ? [what]+1 : [what]+2;"
您只需要重复表达式:
int y = (index >> 8) < 10 ? (index >> 8) + 1 : (index >> 8) + 2;
它不是很好,也不可读,所以我不明白为什么你必须这样做。语言中没有内置方式来引用?
. 由于表达式在 C 中可能有副作用,如果有的话会很麻烦。
你有这个表达式的方式是最好的,你可以在没有代码重复的情况下到达那里。如果您绝对需要它是单个字符串,您可以简单地执行以下操作:
int y = (index >> 8) < 10 ? (index >> 8)+1 : (index >> 8)+2;
因为 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;
请注意,您不能在值声明语句中使用逗号运算符,因为在该上下文中它成为序列分隔符。
尝试以这种方式优化源代码通常没有用处。C 没有规定计算机必须执行哪些具体操作;C 指定程序必须达到的结果。(通过 C 中的“好像”模型。编译器生成的程序必须产生结果,就好像您逐步执行了您编写的特定操作,但这些结果实际上可以通过实现选择的任何指令序列获得。程序只需要重现结果,而不是机制。)
通常,您应该编写清晰的代码,并且应该允许编译器中的优化器高效地执行计算。
或者,通过删除三元。移位相当于除以 256,我们也可以比较移位前的值。
int y = (index >> 8) + 1 + (index >= 2560);
当然, index 应该是积极的,这样才能正常工作。
编辑:该表达式还具有没有临时写访问权限和没有序列点的优点。
可以使用这种形式:
int y = (y = index >> 8) < 10 ? y+1 : y+2;
在这里,y 被分配了 index >> 8 的临时值,因此您可以在 ? 之后重用该值。操作员。
与大卫的类似回答相反,这种形式也可以在价值声明语句中使用。