"简化"为一行

Val*_*rij 2 c obfuscation

只是做我的Homeworks并发现了这件作品

A[j]=A[j-1];
j--;
Run Code Online (Sandbox Code Playgroud)

有没有办法简化这一行?编辑一个声明?

我试过了

A[j--]=A[j];
Run Code Online (Sandbox Code Playgroud)

但似乎效果不好.

代码来自InsertSort算法

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

Tho*_*ith 7

从标准:

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

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

  • 这是第二句相关的. (4认同)

R..*_*R.. 6

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

A[j]=A[j-1], j--;
Run Code Online (Sandbox Code Playgroud)

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

j--, A[j+1]=A[j];
Run Code Online (Sandbox Code Playgroud)

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

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