@KirDorianIrsei

Таблица истинности С++. Почему здесь разные результаты?

Здравствуйте! Я никак не могу понять, почему у меня разнятся ответы.
Есть выражение "(x ≡ z ) ∨ (x → (y ∧ z))", необходимо найти все возможные x, y и z, при которых функция примет значение 0. Для решения я написал следующее:

#include <iostream>

using namespace std;

int main() {
	for (int x = 0; x < 2; x++)
		for (int y = 0; y < 2; y++)
			for (int z = 0; z < 2; z++)
					if ( ( x == z) || (!x || (y && z)) == 0)
						cout << x << y << z << endl;
}


И получил:
000
010
100
101
110
111
Хотя должен был иметь на выходе только 110 и 100, поэтому я решил расчленить выражение на две части:

#include <iostream>

using namespace std;

int main() {
	for (int x = 0; x < 2; x++)
		for (int y = 0; y < 2; y++)
			for (int z = 0; z < 2; z++)
					if ((!x || (y && z)) == 0)
						cout << x << y << z << endl;
						cout << "End of cycle 1" << endl;
    for (int x = 0; x < 2; x++)
		for (int y = 0; y < 2; y++)
			for (int z = 0; z < 2; z++)
					if ( ( x == z) == 0)
						cout << x << y << z << endl;
}


Результат:
100
101
110
End of cycle 1
001
011
100
110

Из этого следует, что если между выражениями стояло бы логическое ИЛИ, то должно было бы получиться как раз 100 и 110.

Подскажите, пожалуйста, что я упускаю
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
( x == z) || (!x || (y && z)) == 0 означает ( x == z) || ( (!x || (y && z)) == 0 ).
Приоритет у сравнения выше, чем у ||, которое, по идее, есть лишь часть считаемого выражения. Поэтому у вас полечается не "выражение == 0" а "выражение1" или "выражение2 == 0".
Возьмите все ваше выражение в скобки и все заработает.

Во втором куске кода у вас 2 отдельных выражение сравнивается с 0 и скобочки у вас там расставлены правильно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы