Направих този код
#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). Ако те се изпълняват паралелно, резултатът може да бъде всичко.
Не можем да гарантираме състоянието на програмата след този ред. Не го използвай.