указатели увеличивают проблему внутри if..else - PullRequest
1 голос
/ 09 мая 2020

Как часть довольно сложной функции, я написал этот фрагмент кода:

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++;

Он работает отлично. Но верхний код тоже должен работать, верно? Есть мысли?

1 Ответ

3 голосов
/ 09 мая 2020

*(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>. (Возможно, это не на 100% верно, но вам все равно лучше избегать этих выражений)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...