|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Alexandr Molchevsky 2:4656/7.2 02 Nov 2003 12:58:57 To : Vasya Kruglov Subject : Kylix крек -------------------------------------------------------------------------------- 01 Nov 03 11:53, you wrote to me: AD>>> ну и что? крутые фидошные гуру - они на то и крутые гуру, чтоб AD>>> трындеть о высоких материях в эхах. ты, видимо, просто AD>>> новенький. AM>> Hу если это высокие материи : AM>> int i=1; AM>> i=(++i)+(++i)+(++i); AM>> А ведь каждый компилятор имеет свое мнение о том как это AM>> должно работать. Hапример MSVC++ даже два разных мнения имеет, AM>> одно для отладочного режима второе для релиза. И оба AM>> неправильные. :) VK> Я не знаю, какие мнения у MSVC, но мое мнение такое: это пример не VK> "невысоких материй", а обыкновенного... какое бы слово поцензурнее VK> подобрать... идиотизма. Причем в медицинском смысле :-)) Это ты такой умный потому что тут сразу видно что это "идиотизм", а когда у тебя в подобное разворачивается выражение из макросов, например, то так сразу не скажешь. VK> P.S. Есть примеры, когда подобные конструкции (с неочевидным VK> результатом) оправданы, т.е. их нельзя заменить на код, который может VK> быть понят лишь единственным образом? Легко! Вот "чудесное" наблюдение от Антона Москаля: = SU.C_CPP (2:4656/7.2) ======================================================= Msg : 16 of 51 From : Anton Moscal 2:5020/400 19 Sep 03 15:57:45## To : All Subj : Side effects =============================================================================== From: "Anton Moscal" <msk@mail.tepkom.ru> Hello, All! Вопрос для широкой публики - являтеся ли данная программа корректной программой на С (в частности - что она должна вывести на печать?) =================== int stack [100]; int *p = stack; void push (int v) { *p++ = v; } int pop (void) { return *--p; } int add (void) { int i = pop (); return i + pop (); } int fn (int c) { return c*10; } # include <stdio.h> int main (void) { printf ("%d, %d\n", fn ((push (1), push (2), add ())), fn ((push (3), push (4), add ())) ); return 0; } ==================== Лично я склонен думать, что данная программа undefined, но для меня это было неожиданностью. Anton -+- ifmail v.2.15dev5 + Origin: St.Petersburg University (2:5020/400) VK> Я не утверждаю, что вышенаписанное соответствует действительности. Типа за базар не отвечаешь? :) Hа случай если ты и этот пример посчитаешь идиотизмом ниже пояснение в чем фишка: = SU.C_CPP (2:4656/7.2) ======================================================= Msg : 20 of 51 From : Anton Moscal 2:5020/400 22 Sep 03 21:11:23## To : Viktor Ostashev Subj : Re: Side effects =============================================================================== From: "Anton Moscal" <msk@mail.tepkom.ru> Hello, Viktor! You wrote to Anton Moscal on Mon, 22 Sep 2003 19:39:42 +0400: AM>> fn не имеет побочного эффекта - int fn (int c) { return c*10; } VO> Я имел в видy, что вызов содеpжит в себе вычисление фyнкций с VO> побочным VO> эффектом. Содержит. Hо дело здесь не в том, что значение выражения зависит от порядка вычислений вызовов fn. Дело в том, что эти подвыражения вычилсяются _одновременно_ (функции тут строго говоря ни при чем - они нужны просто чтобы спровоцировать транслятор на требуемый эффект) Hа самом деле почему меня этот пример сильно удивил - я понял, что идиома, которой я пользовался и считал безопасной, таковой не является - а именно - extern int _temp; # define sqr(x) (_temp = (x), _temp * _temp) то выражение sqr (x) + sqr (y) - unspecified. Anton -+- ifmail v.2.15dev5 + Origin: St.Petersburg University (2:5020/400) Alexandr --- GoldED+/W32 1.1.5-21011 * Origin: ----> Default GoldED Origin <---- (2:4656/7.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/22913fa4d630.html, оценка из 5, голосов 10
|