Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Kylix крек   Vasya Kruglov   01 Nov 2003 12:53:33 
 Kylix крек   Alexandr Molchevsky   02 Nov 2003 12:58:57 
 Re: Kylix крек   Igor Chumak   03 Nov 2003 12:20:57 
 Re: Kylix крек   Kirill Frolov   04 Nov 2003 22:59:38 
Архивное /ru.linux/22913fa4d630.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional