Перейти к содержанию

Antonshka

Пользователи+
  • Постов

    410
  • Зарегистрирован

  • Посещение

  • Победитель дней

    16

Комментарии блога, опубликованные Antonshka

  1. 2 часа назад, MasterGH сказал:

    Верно. С "or" будет работать как с таким выражением

     

    ( (v1 && v2 && v3) || (v4 && v5) )

    (левая часть) || (правая часть)

     

    Левая часть перестанет проверяться при первом false иначе пройдет до OR и прыгнет на успех в 6C1DD6.

    Левая часть, если встретит false, то перескочит на проверку правой части.

    Правая часть должна пройти все проверки до успеха в адрес 6C1DD6 иначе выход.

    Спасибо что помог до конца разобраться.

    • Плюс 1
  2. 2 часа назад, MasterGH сказал:

    >> В качестве аргумента выступает все выражение до следующего слева/справа опреатора

    Нет-нет. В данном случае так не может быть, потому что нет скобок. Все идет последовательно как в дизассемблере.

     

    Что если взять вот такой пример

    Спойлер
    int main() {
        INT v1 = 0;
        INT v2 = 1;
        INT v3 = 1;
        INT v4 = 1;
        INT v5 = 1;
        if (v1 && v2 && v3 || v4 && v5) {
            std::wcout << L"this work";
        }
    
        return 0;
    }

     

     

    Так как v1 равно 0, значит по правилам v2 не будет проверяться. Проверка перейдет на v4.  Это показывает и дизассемблер

    Спойлер
        INT v1 = 0;
    006C1D95  mov         dword ptr [v1],0  
        INT v2 = 1;
    006C1D9C  mov         dword ptr [v2],1  
        INT v3 = 1;
    006C1DA3  mov         dword ptr [v3],1  
        INT v4 = 1;
    006C1DAA  mov         dword ptr [v4],1  
        INT v5 = 1;
    006C1DB1  mov         dword ptr [v5],1  
        if (v1 && v2 && v3 || v4 && v5) {
    006C1DB8  cmp         dword ptr [v1],0  
    006C1DBC  je          __$EncStackInitStart+4Eh (06C1DCAh)  
    006C1DBE  cmp         dword ptr [v2],0  
    006C1DC2  je          __$EncStackInitStart+4Eh (06C1DCAh)  
    006C1DC4  cmp         dword ptr [v3],0  
    006C1DC8  jne         __$EncStackInitStart+5Ah (06C1DD6h)  
    006C1DCA  cmp         dword ptr [v4],0  
    006C1DCE  je          __$EncStackInitStart+6Dh (06C1DE9h)  
    006C1DD0  cmp         dword ptr [v5],0  
    006C1DD4  je          __$EncStackInitStart+6Dh (06C1DE9h)  
            std::wcout << L"this work";
    006C1DD6  push        offset string L"this work" (06C9B30h)  
    006C1DDB  mov         eax,dword ptr [__imp_std::wcout (06CD098h)]  
    006C1DE0  push        eax  
    006C1DE1  call        std::operator<<<wchar_t,std::char_traits<wchar_t> > (06C1226h)  
    006C1DE6  add         esp,8  
        }
    
        return 0;

     

    Значит OR проверяет все что слева (v1 && v2 && v3). А вернее сказать считается, со всем что слева. Ведь v3 здесь true, а значит то что правее OR по правилам проверяться не должно. Однако же оно проверяется, потому что OR считается не только с v3, но и с v1 и v2.

    Вот, а я просто думал что OR считается только с v3, только с чем то одним..

     

     

  3. А я с оператором OR никак не мог разобраться.

    Цитата

     Оператор "or" возвращает свой первый аргумент, если он не равен false и в противном случае возвращается второй аргумент.

    В качестве аргумента выступает все выражение до следующего слева/справа опреатора OR, если таковой имеется, или до начала/конца выражения. Так ведь?

    А то я думал что только до первой переменной слева/справа.

     

    Disassembler показывает, что происходит на самом деле.

    Спойлер
    Спойлер
    int main() {
        int v1 = 1;
        int v2 = 1;
        int v3 = 1;
        int v4 = 0;
        int v5 = 1;
        if (v1 && v2 && v3 || v4 && v5) {
            std::wcout << L"work";
        }
        return 0;
    }

     

    Спойлер
        int v1 = 1;
    00FC2605  mov         dword ptr [v1],1  
        int v2 = 1;
    00FC260C  mov         dword ptr [v2],1  
        int v3 = 1;
    00FC2613  mov         dword ptr [v3],1  
        int v4 = 0;
    00FC261A  mov         dword ptr [v4],0  
        int v5 = 1;
    00FC2621  mov         dword ptr [v5],1  
        if (v1 && v2 && v3 || v4 && v5) {
    00FC2628  cmp         dword ptr [v1],0  
    00FC262C  je          __$EncStackInitStart+4Eh (0FC263Ah)  
    00FC262E  cmp         dword ptr [v2],0  
    00FC2632  je          __$EncStackInitStart+4Eh (0FC263Ah)  
    00FC2634  cmp         dword ptr [v3],0  
    00FC2638  jne         __$EncStackInitStart+5Ah (0FC2646h)  
    00FC263A  cmp         dword ptr [v4],0  
    00FC263E  je          __$EncStackInitStart+6Dh (0FC2659h)  
    00FC2640  cmp         dword ptr [v5],0  
    00FC2644  je          __$EncStackInitStart+6Dh (0FC2659h)  
            std::wcout << L"work";
    00FC2646  push        offset string L"work" (0FC9B30h)  
    00FC264B  mov         eax,dword ptr [__imp_std::wcout (0FCD098h)]  
    00FC2650  push        eax  
    00FC2651  call        std::operator<<<wchar_t,std::char_traits<wchar_t> > (0FC1226h)  
    00FC2656  add         esp,8  
        }
        return 0;

     

     

     

  4. Я изучаю с++ уже второй месяц, но написать такой программы как у тебя пока не могу. Даже и не имею представления о том как это сделать. Может это от того, что я решил сперва освоить самые основы.

     

    На данный момент мною прочитана книга Лафоре, и начата книга "с++ Primer" (~300 страниц из 1124).

    Книга Лафоре имеет замечательную постепенность преподавания материала, забегания вперед практически нет. Читается на одном дыхании. "с++ Primer" в этом плане не такова, но её материал более концентрирован, нет отклонений ни направо ни налево, все строго и без единого лишнего слова. "с++ Primer" нужно читать после Лафоре.

    • Понравилось 1
  5. Привет, меня заинтересовал тот факт, что приложение написано на  с++.

    Расскажи о своем пути изучения этого языка.

    - как давно началось твоё изучение этого языка?

    - сколько материала было прочитано, сколько книг?

    - обучаешься в училище?

    - посоветуешь книги по с++?

    - какая часть языка была самая труднопонимаемая?

    Также, отчего 64 битная версия не выйдет в ближайшее время?

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.