LINUX.ORG.RU
Ответ на: комментарий от toady2

>если = сделан как operator=

Чего?

Да, в сях та же фигня. Я несколько раз напарывался на свои косяки в коде, где писал if (per = 0) {}, и долго тупил над кодом, пока не видел, что надо было ==, а не =. Вот за это я и люблю С и плюсы.

Zhbert ★★★★★
()
Ответ на: комментарий от anonymous

gcc и g++ по дефолту не выдают. А вот с -Wall уже ругаются.

cx ★★
()
Ответ на: комментарий от Zhbert

>. Я не смотрю обычно на варнинги =) Больше доверяю своему мозгу

/0

tailgunner ★★★★★
()
Ответ на: комментарий от toady2

какое значение будет у «а»?

в С++ это _МОЖЕТ_ быть не верным. смотря как определен оператор присваивания

frozenix ★★★
()
Ответ на: комментарий от Zhbert

> Я не смотрю обычно на варнинги =) Больше доверяю своему мозгу, чем конпелятору.

as a fellow KDE developer once said: «I don't do build tests before comitting; users generate better error messages than gcc»

Да?

akk ★★★★★
()

> Верно ли

да. хотя могут быть нюансы, если bar — volatile. ЕМНИП, стандарт говорит, что результат присваивания равен присваиваемому значению, а не значению переменной, которой присваивали, после присваивания (что не одно и то же в случае mmio).

arsi ★★★★★
()
Ответ на: комментарий от shty

Zhbert: Да shty: нет, конечно, не эквивалентно

Вы меня запутали. Смутно помню, что результат присваивания a=b равен новому значению a. Если так, то, наверное, ответ — да. Пишут же

if (!(f = fopen(...))) { ... }

toady2
() автор топика
Ответ на: комментарий от arsi

ЕМНИП, стандарт говорит, что результат присваивания равен присваиваемому значению, а не значению переменной, которой присваивали, после присваивания (что не одно и то же в случае mmio).

А можно конкретный пример, когда это «не одно и то же»?

toady2
() автор топика
Ответ на: комментарий от toady2

>Меня интересует стандарт, а не поведение моего компилятора.

Тоже верно. Но тогда нужно было не полениться послюнявить пальцы и открыть нужную страницу книжки по Си.

ttnl ★★★★★
()
Ответ на: комментарий от toady2

g++ выдает ошибку, если «type result = func ()» — не единственное выражение под скобками.

note173 ★★★★★
()
Ответ на: комментарий от ttnl

Нужная страница учебника говорит, что a=b равно новому a. Стандарт я не могу читать: он на английском, с чем у меня плохо и много непонятных слов, которые даже в русском переводе я не знаю.

Но что-то похожее на реплику arsi я читал: там было что-то вроде «left value, но не lvalue». Я такое не умею парсить.

Ну, в общем-то, я разобрался. Хоть тут были и несовместимые ответы, поверил большинству и arsi, который, судя по ответу, вроде бы разбирается в теме. Резюме: в сях на обычных переменных (не volatile и пр.) f(a=b) эквивалентно a=b;f(a), эквивалентно a=b;f(b). В С++ даже на обычных переменных это может быть не верно — зависит от конкретного оператора присваивания. Так?

toady2
() автор топика
Ответ на: комментарий от toady2

> А можно конкретный пример, когда это «не одно и то же»?

конечно можно:

foo(bar = baz);

не одно и то же, что и

bar = baz;
foo(bar);

если bar — volatile и алиасит mmio.

arsi ★★★★★
()

По стандарту присваивание является выражением и результат этого выражения равен результату вычисления выражения в правой части присваивания.

delete83 ★★
()
Ответ на: комментарий от toady2

А вот a=b;f(b) уже не хорошо. Пример b - double, a - char. Поведение f(a) и f(b) может быть различным.

io ★★
()
Ответ на: комментарий от delete83

В стандарте есть четкий пример, когда (с=getchar()) == EOF не является корректным именно из-за того, что выполняется присваивание. Не надо забывать про преобразованиях типов.

io ★★
()
Ответ на: комментарий от toady2

Резюме: в сях на обычных переменных (не volatile и пр.) f(a=b) эквивалентно a=b;f(a), эквивалентно a=b;f(b). В С++ даже на обычных переменных это может быть не верно — зависит от конкретного оператора присваивания. Так?

Нет, С и С++ в указанном arsi случае ведут себя одинаково. Другое дело что это имеет смысл только в ядре или когда ОС вообще нет. В С++ кривая перегрузка оператора «=» тоже даст разные результаты.

Pavval ★★★★★
()
Ответ на: комментарий от tailgunner

> Ты сгенерированный код проверил?

> сгенерированный код

> сгенерированный

каким компилятором? или есть компилятор, который, по авторитетному заявлению ansi/iso/iec, всегда генерирует код, на 100.00000% соответствующий стандарту?

arsi ★★★★★
()
Ответ на: комментарий от tailgunner

Чтобы быть уверенным в эквивалентности придётся читать выхлопы всех компиляторов подо всеми архитектурами во всех условиях.

legolegs ★★★★★
()
Ответ на: комментарий от arsi

> ЕМНИП, стандарт говорит, что результат присваивания равен присваиваемому значению, а не значению переменной, которой присваивали

Не может такого быть, просто потому, что выражение присваивания имеет тип lvalue.

LamerOk ★★★★★
()
Ответ на: комментарий от toady2

> OK. А в C++ это верно (в том числе, если = сделан как operator=)?

Нет. operator= совершенно не обязан возвращать *this.

slovazap ★★★★★
()
Ответ на: комментарий от arsi

> каким компилятором?

Да хоть каким-нибудь.

или есть компилятор, который, по авторитетному заявлению ansi/iso/iec, всегда генерирует код, на 100.00000% соответствующий стандарту?

Если найдется компилятор, генерирующий разный код, это будет значить, что минимум один специалист по компиляторам с тобой согласен.

tailgunner ★★★★★
()

Очевидно, что эквиваленто. Если требуется объяснение по стандарту, то:

6.5.2.2.4: Аргумент может быть выражением любого типа. При вызове аргументы оцениваются и каждому аргументу назначается параметр...

6.5.1: Выражение - последовательность операторов и операндов, которое соответствует вычислению значения ...

6.4.6 : ... содержит таблицу операторов ...

6.5.6: Для сложения требуется, чтобы оба операнда были арифметическими типами или чтобы один был указателем на объект, а второй имел целый тип.

sched
()
Ответ на: комментарий от LamerOk

> Не может такого быть, просто потому, что выражение присваивания имеет тип lvalue.

всё верно: «выражение присваивания имеет тип lvalue», а не значение. и об этом сказано в 6.5.16 (третий пункт) iso/iec 9899:1999.

arsi ★★★★★
()
Ответ на: комментарий от arsi

Тебя это беспокоит? Хочешь об этом поговорить?

LamerOk ★★★★★
()
Ответ на: комментарий от Zhbert

Да, в сях та же фигня. Я несколько раз напарывался на свои косяки в коде, где писал if (per = 0) {}, и долго тупил над кодом, пока не видел, что надо было ==, а не =. Вот за это я и люблю С и плюсы.

Записывайте константу слева, компилятор вас предупредит об ошибке:

if(0 = var) { }
andreyu ★★★★★
()
Ответ на: комментарий от anonymous

> Пишите на Java, компилятор вас предупредит об ошибке

Ага, особенно в случае с булевыми переменными..

gandjubas
()
Ответ на: комментарий от anonymous

Пишите на Java, компилятор вас предупредит об ошибке

«Ошибка: ты пишешь на Java»?

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.