производительность — в C / C ++ x [i] * y [i ++] всегда равно x [i] * y [i]

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

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

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

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

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

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

11

Решение

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


  1. В C ++ 11 стандарт устранил терминологию «точки последовательности», но эффект остается тем же — эти два неупорядочены относительно друг друга.
13

Другие решения

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

8

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

6

Нет,

Значение i ++ + i ++ равно не определено в C а также C++,

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

v[i] = i++;

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

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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector