C单行中的多个操作

C单行中的多个操作,c,reference,integer,C,Reference,Integer,我想用一行代码(C编程语言)完成这项工作: intx=index>>8; int y=x>8)>8)>8)+1:(指数>>8)+2; 它不是很好,也不可读,所以我不明白为什么你必须这样做。语言中没有内置的方法来引用?之前的表达式。由于表达式在C语言中可能有副作用,因此如果有副作用,那就太麻烦了。使用此表达式的方式是最好的,无需重复代码。 如果您绝对需要它是单个字符串,您可以简单地执行以下操作: int y = (index >> 8) < 10 ? (index >&g

我想用一行代码(C编程语言)完成这项工作:

intx=index>>8;
int y=x<10?x+1:x+2;
可能吗?我以前如何引用值?符号,如果我没有将其存储在单独的整数中

"int y = (index >> 8) < 10 ? [what]+1 : [what]+2;"
“int y=(索引>>8)<10?[what]+1:[what]+2;”

您只需重复以下表达式:

int y = (index >> 8) < 10 ? (index >> 8) + 1 : (index >> 8) + 2;
inty=(索引>>8)<10?(指数>>8)+1:(指数>>8)+2;

它不是很好,也不可读,所以我不明白为什么你必须这样做。语言中没有内置的方法来引用
之前的表达式。由于表达式在C语言中可能有副作用,因此如果有副作用,那就太麻烦了。

使用此表达式的方式是最好的,无需重复代码。 如果您绝对需要它是单个字符串,您可以简单地执行以下操作:

int y = (index >> 8) < 10 ? (index >> 8)+1 : (index >> 8)+2;
inty=(索引>>8)<10?(指数>>8)+1:(指数>>8)+2;

因为C不区分空白字符,所以您可以将其放在一行中:

int x = index >> 8; int y = x < 10 ? x+1 : x+2;
如果您的
y
已经存在,您可以使用很少使用的逗号运算符来消除分号,并将其简化为一条语句:

y = ( y = index >> 8 ), y < 10 ? y+1 : y+2;
y=(y=index>>8),y<10?y+1:y+2;

请注意,不能在值声明语句中使用逗号运算符,因为在该上下文中,它将成为序列分隔符。

或者,通过删除三元运算符。移位等于除以256,我们也可以在移位之前比较值

int y = (index >> 8) + 1 + (index >= 2560);
当然,指数应该是正的,这样才能起作用


编辑:表达式还具有无临时写访问和无序列点的优点。

可以使用以下形式:

int y = (y = index >> 8) < 10 ? y+1 : y+2;
inty=(y=index>>8)<10?y+1:y+2;
在这里,y被分配了索引>>8的临时值,因此您可以在?接线员


与David的类似回答相反,此表单也可以在值声明语句中工作。

以这种方式优化源代码通常是没有用的。C未指定计算机必须执行的特定操作;C指定程序必须达到的结果。(通过C中的“仿佛”模型。编译器生成的程序必须生成结果,就像您完成所编写的特定操作一样,但这些结果实际上可以通过实现选择的任何指令序列获得。该程序只需要重现结果,而不需要重现机制。)


通常,您应该编写清晰的代码,并且应该允许编译器中的优化器高效地执行计算。

清晰比简洁更重要。在这种情况下,两行比一行好。
[what]
位必须是
(索引>>8)
括号,重复时会不太清晰,即使优化器可能会为您优化到您想要的内容。虽然这对所使用的示例有效,它不适用于所有形式的相似表达式。它是为了表明,有时通过数学变换,你可以找到更好的表达式。编译器有时会做这类事情,但它们常常受到无法解决的一般性规则的约束(如对数据流、精度和签名的影响)。程序员通常知道得更多,可以用可应用于案例中的表达式替换。
int y = (index >> 8) + 1 + (index >= 2560);
int y = (y = index >> 8) < 10 ? y+1 : y+2;