Как заставить компилятор выполнять сравнение в нужном мне порядке?

Тема в разделе "LANGS.C", создана пользователем Magnum, 17 янв 2012.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Booster
    ну не так уж давно получается.

    leo
    нет, просто читал давно статейку и запала в памяти, но со временем switch поменялся на if
     
  2. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Падеж может произойти не только если указатель нулевой, а если он мусорный, например.
    А вообще есть ощущение, что югенд магнум не для того это пишет...
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    spa
    Может там вообще pure c, а как там я х.з.
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Везде и в си и в си++ такие выражения с && вычисляются строго слева направо, до первого false а с || до первого true, эта штуковина прописана в стандарте и на нее опирается куча кода, в том числе каких-нибудь хитрых макросов.

    Magnum
    А покажите плиз дизасм листинг этого куска из VC, там где вместе со строчками исходного кода.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Тред не читай @ Сразу отвечай

    Magnum
    spa
    Логические операторы выполняются строго слева направо. Более того - Если в цепочке операторов результат очевиден на некотором этапе - например if(ptr && boo->foo()) - (если ptr = 0, то результат не зависит от второй части) - то стандарт гарантирует, что вычисления дальше не пойдут, и конструкция if(ptr && ptr->foo()) - абсолютно законна. Однако, это верно только в том случае, если операторы логики (&&) не перегружены. В противном случае будут выполнены все элементы выражения. Об этом тоже сказано в стандарте, и поэтому умные люди не рекомендуют перегружать логические операторы без крайней необходимости.
     
  6. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Имхо, ТС вводит в заблуждение вас... как дышит :)
     
  7. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Тему можно было закрывать после седьмого поста.
    Проблема решена, тема закрыта
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Magnum
    За такие треды надо по рукам давать - вводишь новичков в заблуждение ;)
     
  9. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Да ладно, такие топики учат никому не верить)
     
  10. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Squash
    +1.
    Слева направо,ответственно заявляю:
    Код (Text):
    1.     if (Integer1 > 10 && Integer2 <20)
    2.     {
    3.         printf("FUCK YOU,MAGNUM!");
    4.     }
    Код (Text):
    1. 0040102E  |. 833D 74334000 >CMP DWORD PTR DS:[Integer1],0A
    2. 00401035  |. 7E 13               JLE SHORT Magnum.0040104A
    3. 00401037  |. 833D 70334000 >CMP DWORD PTR DS:[Integer2],14
    4. 0040103E  |. 7D 0A               JGE SHORT Magnum.0040104A
    5. 00401040  |. 68 00214000      PUSH OFFSET Magnum.??_C@_0BB@GKPFGPMD@FU>;  ASCII "FUCK YOU,MAGNUM!"
    6. 00401045  |. FFD6                CALL ESI
    Конкретно за этот предлагаю ударить по яйцам.
    Проблемы не было. Не отмыться тебе после едросрача.