Подтвердить что ты не робот

В C/С++ x [i] * y [i ++] всегда равно x [i] * y [i]

Возможный дубликат:
Может ли кто-нибудь объяснить эти поведения undefined (i = я ++ + ++ i, я = я ++ и т.д.)
увеличивать значения в printf

У меня есть два двойных массива x и y и integer i. Мой вопрос заключается в том, является ли утверждение:

double res = x[i] * y[i++];

всегда равен утверждению:

double res = x[i] * y[i];
i++;

Возможно ли, что некоторые компиляторы изменят x[i] * y[i++] на y[i++] * x[i], что, очевидно, приводит к другому результату?

4b9b3361

Ответ 1

Нет - x[i] + y[i++] имеет поведение undefined. Вы изменяете значение i, а также используете значение i без промежуточной точки последовательности, которая дает поведение undefined 1.


  • В С++ 11 стандарт исключил терминологию "точка последовательности", но эффект остается тем же - два неупорядоченных относительно друг друга.

Ответ 2

Нет, это undefined, когда происходит приращение.

Ответ 3

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

Ответ 4

Нет,

значение я ++ + я ++ undefined в C и C++.

если вы дважды читаете переменную в выражении, где вы также пишете ее, результат undefined. Не делай этого. Другой пример:

v[i] = i++;

Undefined означает его COMPILER DEPENDENT.
Некоторые компиляторы могут предупредить вас также как undefined, потому что порядок оценки. Очень хорошая ссылка для С++

1 http://www.stroustrup.com/bs_faq2.html#evaluation-order