/ / Точка на последователност в масив [дубликат] - в

Точка на последователност в масив [дубликат] - в

Направих този код

#include <stdio.h>

int main(void)
{
int i = 0;
int arr[20];
while(i < 20)
{
arr[i++] = i;
printf("%dn", arr[i-1]);
}
return 0;
}

който изглежда да отпечата очакваните резултати защо се казва, че може да имате недефинирано поведение?

Отговори:

2 за отговор № 1

Вие се позовавате неопределено поведение, Вие сте се възползвали от точки на последователност, чието използване е недефинирано в C.

Казвате го изглежда да отпечата очакваните резултати - то може или то не може, защото тя е неопределена. Така че фактът, че получавате очакваните стойности, е просто чист късмет.

Що се отнася до получаването на някои предупреждения, моля компилирайте и стартирайте кода; това наистина ще ви предупреди:

предупреждение: операцията върху "i" може да бъде неопределена [-Търсене за последователност]

Демонстрация на живо тук.

Освен това, ако си мислиш защо е просто внимание и не грешка, тогава моля, имайте предвид, че компилаторът не е длъжен да докладва за всичките ви недефинирани поведения - задачата му е просто да компилирате кода си, а не да посочите недефинирано поведение.


1 за отговор № 2

"Работи според очакванията" е един от възможните резултати за недефинирано поведение.

arr[i++] = i; е изрично наречен като пример за неопределено поведение в езиковия стандарт. Редът, по който се оценява всяка субекспресия, е неопределен; тя не е гарантирано да бъде от ляво на дясно i == 1, който и да е от следните резултати са възможни:

arr[1] = 1;
arr[1] = 2;
arr[2] = 2;
arr[2] = 1;

1 за отговор № 3

В зависимост от реда за оценяване, първото изпълнение на

     arr[i++] = i;

може да завърши настройката arr[1] да се 1 (ако LHS се оценява първо) или до 0 (ако първо се оценява RHS). Ако те се изпълняват паралелно, резултатът може да бъде всичко.

Не можем да гарантираме състоянието на програмата след този ред. Не го използвай.