1

Тема: f(i++, i);

int i = 0;
f(i++, i);

В С++ це невизначена поведінка, тобто з під компа можуть вилізти русалоньки і залоскотати. І це не тому, що ми не знаємо порядку обчислення параметрів, а тому, що точка перебігу лише після обчислення всіх параметрів.

В C# це начебто визначена поведінка. І кажуть, що це тому що параметри обчислюються зліва направо. Тут мені не зрозуміло, ну обчислюються вони зліва направо, але побічний і відкладений ефект i++ це оновлення значення i. Так от, де написано, що це відбувається до читання i в другому параметрі?

Подякували: leofun011

2

Re: f(i++, i);

Yola написав:

відкладений

А хто сказав, що в C# він може бути відкладений? Це в C++ надагресивна оптимізація. В C# все спокійніше.

Подякували: leofun01, Yola2

3

Re: f(i++, i);

Yola написав:
int i = 0;
f(i++, i);

В С++ це невизначена поведінка

:o
От як після цього жити ?

Подякували: Yola1

4

Re: f(i++, i);

то с++, то мова квантового програмування?  *SCRATCH*

Подякували: Yola1

5 Востаннє редагувалося Yola (11.10.2018 17:08:03)

Re: f(i++, i);

Так тільки на відміну від квантової механіки, якщо ти знаєш компілятор і версію, то ти можеш точно дізнатись міце і швидкість:)

В С++ все чітко. Є точки перебігу, це якби місця де ти вже можеш гарантовано сказати, що всі load і store з попередніх інструкцій завершені. i++, i це два load і один store, і в С++ не можна двічі читати з однієї комірки пам'яті між двома точками перебігу.

Я просто поки Ріхтера читаю по С#, якщо буде час треба ще специфікацію прочитати, щоб зрозуміти краще такі моменти.

Подякували: koala1

6

Re: f(i++, i);

Yola написав:

в С++ не можна двічі читати з однієї комірки пам'яті між двома точками перебігу.

Читати - легко. І навіть читати та писати. Але не можна читати, писати і знову читати, бо компілятор може зоптимізувати код і відкласти запис на пізніше (але не на наступну точку перебігу).
В плюсах є поняття UB - undefined behavior, і це саме те, що відбувається в цьому місці. Компілятор залежно від налаштувань оптимізації, завантаженості пам'яті, напруги в мережі та фази Місяця може підставити замість UB що завгодно; десь була стаття, як можна "довести" нерозв'язану математичну теорему таким чином (програма повідомляє, що завешилася, бо в ній був "вічний" цикл, який залежав від цієї проблеми, а вічний цикл - це UB).

Подякували: leofun011