Объяснение поведения логических операторов - C#

Узнай цену своей работы

Формулировка задачи:

Итак, уважаемый читатель, прошу Тебя помощи в этой головомойке. Начнем: Дан общий код программы (он короткий, прочитай, не поленись):
public static void Main(string[] args)
        {
        pos1:
            Console.Clear();
            int iA,iB;
            iA=Convert.ToInt32(Console.ReadLine());
            iB=Convert.ToInt32(Console.ReadLine());
            if((iA!=1) | (iB!=1))
                {
                Console.WriteLine("iA!=1 | iB!=1");
                }
            if((iA==1) | (iB==1))
                {
                Console.WriteLine("iA=1 | iB=1");
                }

            for(int XC=-1; XC<2; XC++)
            {
                for(int YC=-1; YC<2;YC++)
                {
                    if((XC!=0) | (YC!=0))
                    {
                        Console.WriteLine("("+(iA+XC)+";"+(iB+YC)+") (XC, YC)=("+XC+";"+YC+")");
                    }
                }
            }
            Console.ReadLine();
            goto pos1;
        }
Теперь разложу проблему по полочкам. В данном примере я буду вводить данные: 1 и 5 (iA = 1; iB = 5). 1 Часть:
if((iA!=1) | (iB!=1))
                {
                Console.WriteLine("iA!=1 | iB!=1");
                }

Если iA или iB не равно 1, то выполняется код внутри оператора

Все логично, все верно, при введении 1 и 5, код выполняется. Идем дальше 2 Часть:
if((iA==1) | (iB==1))
                {
                Console.WriteLine("iA=1 | iB=1");
                }

Если iA или iB равно 1, то выполняется код внутри оператора

Все логично, все верно, при введении 1 и 5, код выполняется. Никакого подвоха? Тогда вот это! Часть 3:
for(int XC=-1; XC<2; XC++)
            {
                for(int YC=-1; YC<2;YC++)
                {
                    if((XC!=0) | (YC!=0))
                    {
                        Console.WriteLine("("+(iA+XC)+";"+(iB+YC)+") (XC, YC)=("+XC+";"+YC+")");
                    }
                }
            }
В кратце объясню - это код я сделал для проверки ближайших членов одного элемента в двумерном массиве. XC - это строка, YC это столбец, т.е. соответствующие координаты члена в двумернике. Смысл этого кода в том, чтобы проверить 8 элементов, которые находятся рядом с текущим:
X-1; Y-1    X; Y-1    X+1; Y-1
X-1; Y       X;Y        X+1; Y
X-1; Y+1    X; Y+1   X+1; Y+1
там, где Х;У это точка, которую проверять не нужно. Все остальные нужно. Понятно, объяснил надеюсь?

Так вот, сама суть проблемы:

if((XC!=0) | (YC!=0))
Догадайся, как работает этот оператор ЕСЛИ? Я, по крайней мере, с первого раза бы точно не угадал. Он работает не так "Если ХС ИЛИ УС не равны нулю, то..." Неееет, он работает вот так! "Если ХС И(!) УС не равны нулю, то..." Где логика? как....Как это объяснить?! Заранее спасибо, Если объяснишь!

p.s. замена | на || разницы не даст.

p.p.s. Выводит вот это:
1
5
iA!=1 | iB!=1
iA=1 | iB=1
(0;4) (XC, YC)=(-1;-1)
(0;5) (XC, YC)=(-1;0)
(0;6) (XC, YC)=(-1;1)
(1;4) (XC, YC)=(0;-1)
(1;6) (XC, YC)=(0;1)
(2;4) (XC, YC)=(1;-1)
(2;5) (XC, YC)=(1;0)
(2;6) (XC, YC)=(1;1)

Решение задачи: «Объяснение поведения логических операторов»

textual
Листинг программы
bool checkX = (XC!=0);
bool checkY = (YC!=0);
if (checkX | checkY)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.5 из 5
Похожие ответы