C if..else中的指针递增问题

C if..else中的指针递增问题,c,pointers,C,Pointers,作为相当复杂函数的一部分,我编写了以下代码: if( (((int)*(pointer-11 .... ) //It is too long and complex { *(pointer++)=*(pointer-12)+1; } else { *(pointer++)=*(pointer-12); } if部分工作正常,但else部分工作如下: *(pointer++)=*(pointer-11); 当我将递增代码与实际行分开时 if( .... ) { *

作为相当复杂函数的一部分,我编写了以下代码:

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++;
它工作得很好。但是上面的代码也应该可以工作,对吗?有什么想法吗?

*(指针++)=*(指针-12)是未定义的行为。这里没有序列点,所以您不知道是先计算
=
的左部分还是右部分

由于它是未定义的行为,编译器可能会执行任何操作,但以下是对它的合理解释:

// Left gets evaluated first    
*(pointer)=*((pointer+1)-12);
pointer++;

// Right gets evaluated first
*(pointer)=*(pointer-12);
pointer++;

请注意,这与指针无关。表达式
x++x
导致未定义的行为,与
x
的类型和运算符无关。(这可能不是100%正确,但无论如何你最好避免使用这些表达式)

你不知道是先计算
指针+++
还是
指针-12
部分。这取决于编译器。此代码具有未定义的行为。如果修改作业左侧的
指针
,则无法在右侧引用它(反之亦然)。如果这样做,结果将是未定义的,并且可能因编译器而异,或者具有不同的优化级别,甚至可能因版本而异。不要这样做。另外,你可以把
*(指针-12)
写成
指针[-12]
,把
*(指针)
写成
*指针
,或者写成
指针[0]
。哦,这和编译器有关。。对吗?所以我应该把它分成两个语句。。?