Тип bool - логическое значение true или false занимает в памяти 1 байт bool man = true; Простые Логические выражения образованы как правило с помощью операторов == >= <= > < != Значение логического выражения имеет тип bool .... a > 0 ..... bool positive = a > 0; Условный оператор if пропускает внутрь {} если выражение в () оказалос истина if (a > 0) { } bool positive = a > 0; if (positive) { } if (здесь достаточно любое логическое значение или логическое выражение) { } // Лучше не сравнивать так if (positive == true) {} // Это примерно то же самое, что написать if ((a%2==0) == true) {} // Лучше так if (positive) {} // Лучше так if (a%2==0) {} Условный оператор Фигурные скобки лучше вставлять всегда для явного определения блоков Неполная форма int a = 4, b = 5, max; max = a; if (b > max) { max = b; } Полная форма считается понятнее для большинства, лучше использовать ее. int a = 4, b = 5, max; if (a > b) { max = a; } else { max = b; } Форма с несколькими цепочками if (a > 0) { System.Console.WriteLine("Положительное"); } else if (a < 0 ){ System.Console.WriteLine("Отрицательное"); } else { System.Console.WriteLine("Ноль"); } Тернарный оператор (возвращает результат - можно присваивать значение переменной) Работает как функция ЕСЛИ в Excel int a = 4, b = 5, max; max = (a > b)?a:b; System.Console.WriteLine(max); Вложенные уже выглядят ненаглядно, лучше не использовать int sign, a = 0; sign = (a > 0)? 1:(a<0)?-1:0; System.Console.WriteLine(sign); String s = (age >= 65)?"Пенсионер":"Не пенсионер"; Логические переменные упрощают понимание алгоритма bool man = true; int age = 80; bool old = age >= 65; if (old) { } ... или ... if (man && old) { } ... или ... bool oldMan = man && old; if (oldMan) { } Логические функции И - пересечение множеств // пересекается множество старых и мужчин bool oldMan = man && old; bool teenager = age >= 12 && age <= 18; НЕ - Логическое отрицание - за пределами множества // Молодые - все кто не старый // понятнее, чем !(age>=65) bool young = !old; ИЛИ - объединение множеств bool freeEntry = old || teenager; Шаблон типа флаг - линейный поиск int value = 5; bool found = false; foreach (int element in array) { if (element == value) { found = true; break; } } System.Console.WriteLine(found); // &&, || - ленивые // & | - не ленивые // Не выводится static bool SecondOperand() { Console.WriteLine("Второй операнд работает"); return true; } static void Main() { System.Console.WriteLine(false && SecondOperand()); } // выводится static bool SecondOperand() { Console.WriteLine("Второй операнд работает"); return true; } static void Main() { System.Console.WriteLine(false & SecondOperand()); } // Не выводится static bool SecondOperand() { Console.WriteLine("Второй операнд работает"); return true; } static void Main() { System.Console.WriteLine(true || SecondOperand()); } & | ^ побитовые, если операнды целые; логические, если операнды логические Исключающее ИЛИ System.Console.WriteLine(true ^ true); На самом деле это то же, что и != Упрощайте с помощью логических переменных // координаты фигуры int xF, yF; // координаты ладьи int xB, yB; // Бьет ли ладья фигуру? Далее может идти Пседокод bool vertical = xF == xR; bool horizontal = yF == yR; if (vertical || horizontal) { } Или bool rook = vertical || horizontal; Далее БьетКакСлон = ГлавнаяДиагональ || ВторостепеннаяДиагональ; БьетКакФерзь = БьетКакСлон || БьетКакЛадья; Особенности сравнения Сравнение примитивных типов == Пример, a == b Сравнение объектов на идентичное содержимое m1.Equals(m2) // Для строк исключение m1 == m2 Но можно и так m1.Equals(m2) String m1="Привет", m2="Привет"; System.Console.WriteLine(m1.Equals(m2)); Ветвление в зависимости от числового значения int mark = 4; Плохой дизайн, можно подумать что в каждую ветку можно пройти, хоть и работает if (mark == 2) { // двойка } if (mark == 3) { // тройка } if (mark == 4) { // четверка } Чуть лучше if (mark == 2) { // опять двойка } else if (mark == 3) { // опять двойка } else if (mark == 4) { // опять тройка } else if (mark == 5) { } // Лучше всегда заканчивать else чтобы всегда отрабатывать случаи. else{ } Для ветвлений от числовых значений, лучше использовтаь оператор выбора int mark = 4; String desc= ""; switch (mark) { case 1: desc="кол"; break; case 2: desc="два"; break; case 3: desc="три"; break; default: desc="неизвестная оценка"; break; } // Проваливание int month = 4; switch (month) { case 1: case 2: case 12: System.Console.WriteLine("Зима"); break; case 3: case 4: case 5: System.Console.WriteLine("Весна"); break; default: System.Console.WriteLine("Нечто другое"); break; } А так будет ошибка. Нет break после case switch (month) { case 1: case 2: System.Console.WriteLine("Февраль"); case 12: System.Console.WriteLine("Зима"); break; case 3: case 4: case 5: System.Console.WriteLine("Весна"); break; default: System.Console.WriteLine("Нечто другое"); break; } Также для проверки на соответствие чего-либо (проверка идентичности) (срабатвает метод Equals) String month = "Январь"; switch (month.ToLower()) { case "январь": case "февраль": case "декабрь": System.Console.WriteLine("Зима"); break; default: System.Console.WriteLine("Нечто другое"); break; Законы Де Моргана для сокращения логических выражений https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B_%D0%B4%D0%B5_%D0%9C%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B0 Табличные методы int mark = 4; String [] values = new String[] { "Кол", "Неуд", "Удовл", "Хор", "Отл"}; String desc = values[mark-1]; Ассерты Ассерт Проверяет условие; если условие имеет значение false, выводит сообщения и отображает окно сообщения В следующем примере создается индекс для массива, выполняется некоторое действие для задания значения индекса, а затем вызывается Assert для подтверждения допустимости значения индекса. Как правило, метод Assert используется для обнаружения логических ошибок во время разработки программы. static void Main(string[] args) { // Create an index for an array. int index; // Perform some action that sets the index. index = -40; // Test that the index value is valid. Debug.Assert(index >= 0, "Индекс в массиве не может быть отрицательным"); System.Console.WriteLine("Конец"); System.Console.ReadLine(); } Про Ассерты https://habr.com/ru/post/141080/