作为一个相当复杂的函数的一部分,我写了这段代码。
if( (((int)*(pointer-11 .... ) //It is too long and complex
{
*(pointer++)=*(pointer-12)+1;
}
else
{
*(pointer++)=*(pointer-12);
}
if部分很好用,但是 else部分的工作原理是:
*(pointer++)=*(pointer-11);
当我把增量代码和实际行分开时... ..,
if( .... )
{
*(pointer)=*(pointer-12)+1;
}
else
{
*(pointer)=*(pointer-12);
}
pointer++;
它能完美地工作。但是上面的代码应该也能用吧?有什么想法吗?
*(pointer++)=*(pointer-12);
是未定义的行为。这里没有序列点,所以你不知道是左边还是右边的部分。=
将首先被评估。
由于它是未定义的行为,编译器可能会做任何事情,但这些都是相当合理的解释。
// Left gets evaluated first
*(pointer)=*((pointer+1)-12);
pointer++;
// Right gets evaluated first
*(pointer)=*(pointer-12);
pointer++;
注意,这与指针无关。表达式 x++ <op> x
导致未定义的行为,而不管是什么类型的 x
有什么运营商 <op>
是。(这也许不是百分之百的正确,但无论如何你最好避免这些表达方式)