-Предупреждение о последовательности - что это значит и нарушает ли он стандарт ANSI C?

В соответствии

tab[i] = tab[i+1] - tab[i] + (tab[i+1] = tab[i]);

У меня есть предупреждение

[Warning] operation on '*(tab + ((sizetype)i + 1u) * 4u)' may be undefined [-Wsequence-point]

Я хочу поменять эти два элемента целочисленных массивов без временной переменной и без нарушения ANSI C. Программа по-прежнему работает, но так ли это?

2 ответа

Решение

Ваш код опирается на поведение, которое не охватывается стандартом. Таким образом, ваш код может вести себя по-разному на разных компиляторах, в разных версиях одного и того же компилятора и даже вести себя по-разному в зависимости от окружающего кода.

Проблема в том, что вы оцениваете и назначаете tab[i+1] без разделяющей точки последовательности. Вам может показаться очевидным, что ваша программа будет выполнять вычисления слева направо, но стандарт C не требует этого. Компилятор может скомпилировать ваш код следующим образом:

tab[i+1] = tab[i];
tab[i] = tab[i+1] - tab[i] + tab[i+1];

В качестве отдельной заметки. Обмен двух переменных - это оптимизированная и легко распознаваемая операция, любой оптимизирующий компилятор выберет самые быстрые инструкции, если вы напишите:

int temp = tab[i];
tab[i] = tab[i+1];
tab[i+1] = temp;
      **For me, C ANSI Code "tab[i] = tab[i+1] - tab[i] + (tab[i+1] = tab[i]);"
is made in time:
X  <=> tab[i+1] = tab[i] = Y
tab[i] = tab[i+1] - tab[i] + (X);
tab[i] =    Y     -   Y    + (Y);
tab[i] =  Y = tab[i].
So the only data movement was: tab[i+1] receiving tab[i], wich is simply
tab[i+1] = tab[i]; 
No ?**
Другие вопросы по тегам