刚刚完成我的Homeworks并发现了这篇文章
A[j]=A[j-1];
j--;
有没有办法将其简化为一行? 编辑一个声明?
我试过
A[j--]=A[j];
但似乎效果不佳。
代码来自InsertSort算法
编辑这个问题不需要做我的作业,我只是好奇
答案 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