Защо компилаторът ми дава предупреждение, че операцията по k може да бъде неопределена? Какво мога да направя, за да премахна това предупреждение?
int main(void){
int k=0;
int a,b;
do{
k = k++;
printf("The value of k is: %dn",k);
}while(some condition that does not involve k);
return EXIT_SUCCESS
}
Отговори:
1 за отговор № 1Компилаторът дава възможност на ОП да знае последователността k = k++;
не е дефиниран от С.
Някои компилатори може да се увеличат k
и след това присвоява стойността преди добавянето към k
- по този начин да се презапише нарастването. Друг компилатор може да направи увеличението, но все още не запази резултата, присвоява стойността преди прибавянето k
, и след това запазете увеличената стойност k
.
Всичко на всичко, изпълнявайки код като a = k++ / ++k;
или подобни, създава проблеми. Компилаторът може първо да оцени първо лявата или дясната част на разделянето, последователността не е дефинирана и получавате различни отговори.
Вместо това използвайте:
k++;
или
++k;
или
k = k + 1;
1 за отговор № 2
виж тази връзка Недефинирано поведение и точки на последователност
k = k++; // k is modified more than once