2013-11-07 4 views
1

Я не знаю, где искать это (возможно, стандартное, но все еще не знаю, что искать), поэтому я попрошу об этом здесь.Установленное значение, равное самому себе

Если в каком-то исполнении array[i2] будет установлен в array[i] где i2 бывает равным i, то это определяется поведение?

Я использую C99GCC 4.8.1), глядя на сборку с gcc -S, я не вижу ничего подозрительного.

+0

Компилятор может даже оптимизировать это. – Sam

+0

Это не будет так, как это зависит от исполнения во время выполнения. Именно по этой причине я заметил «в некотором исполнении». Это больше похоже на массив [idx] = array [i], где idx оказывается равным i. –

+0

@Silverrocker: укажите, какую зависимость вы имеете в виду. –

ответ

0

Если переменная i имеет действительное значение, то назначение

i = i; 

отлично определяется поведение. Это соответствует вашему вопросу, как указано.

Если в вашей ситуации есть что-то более сложное, вы должны предоставить более подробную информацию об этом.

+0

Это все, что есть, поэтому ваш ответ применим. Благодаря! –

1

Это абсолютно определенное поведение. Сначала вычисляется правая часть задания, а затем назначается левой стороне. Обратите внимание, что левая сторона должна разрешить значение l.

+0

Обратите внимание, что это на самом деле то же самое, что и установки переменной, которая будет равна самой себе. Это меняет ситуацию? –

1
foo() { 
    int i, j, a[5], b[5]; 
    i = i; // undefined because reading i is UB 
    j = i; // undefined because reading i is UB 
    a[i] = a[i]; // undefined because reading i is UB 
    a[3] = a[3]; // undefined because reading a[3] is UB 
    b[3] = a[3]; // undefined because reading a[3] is UB 
} 
+0

Если переменные инициализированы, то это будет определено, правильно? –

+0

Да, конечно. –

+0

ОК, я думал, что это может быть связано с точкой последовательности, но это, похоже, не так. Благодарю. –

Смежные вопросы