-
Постов
410 -
Зарегистрирован
-
Посещение
-
Победитель дней
16
Тип контента
Профили
Форумы
Загрузки
Блоги
Комментарии блога, опубликованные Antonshka
-
-
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, только с чем то одним..
-
А я с оператором 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;
-
Я изучаю с++ уже второй месяц, но написать такой программы как у тебя пока не могу. Даже и не имею представления о том как это сделать. Может это от того, что я решил сперва освоить самые основы.
На данный момент мною прочитана книга Лафоре, и начата книга "с++ Primer" (~300 страниц из 1124).
Книга Лафоре имеет замечательную постепенность преподавания материала, забегания вперед практически нет. Читается на одном дыхании. "с++ Primer" в этом плане не такова, но её материал более концентрирован, нет отклонений ни направо ни налево, все строго и без единого лишнего слова. "с++ Primer" нужно читать после Лафоре.
- 1
-
Привет, меня заинтересовал тот факт, что приложение написано на с++.
Расскажи о своем пути изучения этого языка.
- как давно началось твоё изучение этого языка?
- сколько материала было прочитано, сколько книг?
- обучаешься в училище?
- посоветуешь книги по с++?
- какая часть языка была самая труднопонимаемая?
Также, отчего 64 битная версия не выйдет в ближайшее время?
[Lua] Логические операторы
in Блог MasterGH
Блог MasterGH в General
Опубликовано
Спасибо что помог до конца разобраться.