В 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]
, что, очевидно, приводит к другому результату?
Ответы
Ответ 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