Да, в сях та же фигня. Я несколько раз напарывался на свои косяки в коде, где писал if (per = 0) {}, и долго тупил над кодом, пока не видел, что надо было ==, а не =. Вот за это я и люблю С и плюсы.
да. хотя могут быть нюансы, если bar — volatile. ЕМНИП, стандарт говорит, что результат присваивания равен присваиваемому значению, а не значению переменной, которой присваивали, после присваивания (что не одно и то же в случае mmio).
ЕМНИП, стандарт говорит, что результат присваивания равен присваиваемому значению, а не значению переменной, которой присваивали, после присваивания (что не одно и то же в случае mmio).
А можно конкретный пример, когда это «не одно и то же»?
Нужная страница учебника говорит, что a=b равно новому a. Стандарт я не могу читать: он на английском, с чем у меня плохо и много непонятных слов, которые даже в русском переводе я не знаю.
Но что-то похожее на реплику arsi я читал: там было что-то вроде «left value, но не lvalue». Я такое не умею парсить.
Ну, в общем-то, я разобрался. Хоть тут были и несовместимые ответы, поверил большинству и arsi, который, судя по ответу, вроде бы разбирается в теме. Резюме: в сях на обычных переменных (не volatile и пр.) f(a=b) эквивалентно a=b;f(a), эквивалентно a=b;f(b). В С++ даже на обычных переменных это может быть не верно — зависит от конкретного оператора присваивания. Так?
В стандарте есть четкий пример, когда (с=getchar()) == EOF не является корректным именно из-за того, что выполняется присваивание. Не надо забывать про преобразованиях типов.
Резюме: в сях на обычных переменных (не volatile и пр.) f(a=b) эквивалентно a=b;f(a), эквивалентно a=b;f(b). В С++ даже на обычных переменных это может быть не верно — зависит от конкретного оператора присваивания. Так?
Нет, С и С++ в указанном arsi случае ведут себя одинаково. Другое дело что это имеет смысл только в ядре или когда ОС вообще нет. В С++ кривая перегрузка оператора «=» тоже даст разные результаты.
каким компилятором? или есть компилятор, который, по авторитетному заявлению ansi/iso/iec, всегда генерирует код, на 100.00000% соответствующий стандарту?
Да, в сях та же фигня. Я несколько раз напарывался на свои косяки в коде, где писал if (per = 0) {}, и долго тупил над кодом, пока не видел, что надо было ==, а не =. Вот за это я и люблю С и плюсы.
Записывайте константу слева, компилятор вас предупредит об ошибке: