“简化”为一行

时间:2010-12-28 14:06:41

标签: c obfuscation

刚刚完成我的Homeworks并发现了这篇文章

A[j]=A[j-1];
j--;

有没有办法将其简化为一行? 编辑一个声明?

我试过

A[j--]=A[j];

但似乎效果不佳。

代码来自InsertSort算法

编辑这个问题不需要做我的作业,我只是好奇

3 个答案:

答案 0 :(得分:7)

来自标准:

  

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。

也就是说,A[j] = A[--j];将导致未定义的行为。不要这样做。 A[j]=A[j-1]; j--;非常清晰,简洁,令人满意。

答案 1 :(得分:6)

如果目标只是消除中间的;,那么您可以在宏上下文中使用它,或者作为没有大括号的单个语句,请尝试使用逗号运算符:< / p>

A[j]=A[j-1], j--;

或者如果您希望指定的值作为表达式的结果:

j--, A[j+1]=A[j];

如果未使用表达式的结果,两者都应在合适的编译器上生成相同的代码。

正如其他人所说,任何没有逗号运算符的尝试都会因序列点问题而导致未定义的行为。如果你没有充分的理由像这样压缩代码,我建议你不要这样做。除非你对C非常有经验,否则你几乎肯定会搞砸它并引入微妙的错误(其中一些可能不会出现在您当前的编译器中,但在未来的版本中,为那些陷入调试代码的人制造地狱)。

答案 2 :(得分:0)

实际上有一种方法

A[j+1]=A[--j];

在VC中运行良好但在g ++上导致UB