1. C++ / Говнокод #15587

    +77

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    // Решил узнать, что лучше C или C++.
    
       int C;
    
       if(C == C++)
          cout << "То же самое.";
       else 
          cout << "Разные.";

    C++ то же самое что и С.
    Как было сказано в одной книге компьютер очень глупый(Хоть он тут и не причём, компилятор подставил).

    Запостил: Ignat776, 26 Марта 2014

    Комментарии (20) RSS

    • ага, какое мороженое вкуснее - клубничное или карамельное.

      Где здесь C++, Lure Of Chaos?!
      Ответить
    • Мелкософтовский компилятор?
      Гцц вычисляет справа налево операнды: http://ideone.com/2Jd0re
      А вообще это UB.
      Ответить
      • Причём это UB аж по двум причинам!
        Ответить
        • а вторая?
          Ответить
          • C не инициализирована?
            Ответить
            • Откуда мы знаем? Может, в нулевой строке написано static. Тогда у C вызовется дефолтный конструктор, инизиализирующий значение нулем.
              Ответить
      • СИШКОПРОБЛЕМЫ!
        Ответить
      • >Гцц вычисляет справа налево операнды
        Ну-ну. http://ideone.com/omIa5M
        Ответить
      • да? то есть если я напишу if(myObject != null && myObject.property == 3) , то словлю эксепшн?
        Ответить
        • У "&&", "||" и "," свой оговоренный в стандарте порядок вычисления (и не вычисления) аргументов. Так что не словишь. А в
          someclass* x;
          myfunc(x = new someclass, x -> dosomething());
          можешь и словить. Как карта ляжет.

          Кстати эти особенности работают только для этих операторов по умолчанию. Именно поэтому их очень не рекомендуют перегружать.
          Ответить
        • У && особая семантика, которая гарантирует, что сначала посчитается левая часть, и если она будет true - то потом правая. Так что пример не катит.
          Ответить
          • то есть, чтобы гарантировать, что if(C==C++) будет считаться всегда слева направо я должен писать if(1==1 && C==C++) ?
            Ответить
            • 1==1 посчитается перед С==С++. Но порядок вычисления С и С++ всё ещё не определён. Хватит пытаться полить кактус кетчупом перед едой.
              Ответить
              • Ценный совет. От вашего кетчупа у меня цветы вянут.
                Ответить
            • Нет. Гарантировать это нельзя. Никак. Можно только разнести в отдельные выражения.
              Ответить
            • Держи статейку: http://cpp-reference.ru/articles/sequence-points-and-expression-evaluation/
              Ответить
          • только если && не перегружен
            Ответить
            • К сожалению - да. Но их почти никто и не перегружает кроме извращений типа boost::phoenix.
              Ответить

    Добавить комментарий