У меня есть упражнение по линейному уравнению на Паскале, и я создал простой код для сравнения входных чисел, но когда я пытаюсь его запустить. У меня проблема с несовместимыми типами, got BOOLEAN and expected LONGINT.

program LinearEquation;

var
  a, b: real;

begin
  readln(a, b);

  if (b = 0 and a = 0) then
    writeln('INFINITY')
  else if (b = 0 and a <> 0) then
    writeln(1)
  else if (a = 0 and b <> 0) then
    writeln(0)
  else if(b mod a = 0) then
    writeln(1);

  readln;

end.

А также

13 / 9 rownan~1.pas
 Error: Incompatible types: got "BOOLEAN" expected "LONGINT"
15 / 14 rownan~1.pas
 Error: Incompatible types: got "BOOLEAN" expected "LONGINT"
17 / 14 rownan~1.pas
 Error: Incompatible types: got "BOOLEAN" expected "LONGINT"
17 / 14 rownan~1.pas
 Error: Incompatible types: got "BOOLEAN" expected "LONGINT"
0
user8116296 23 Ноя 2018 в 13:45

1 ответ

Лучший ответ

По крайней мере, в современном Delphi, and имеет более высокий приоритет, чем =, поэтому

a = 0 and b = 0

Интерпретируется как

(a = (0 and b)) = 0.

Но оператор and не может принимать целое число и значение с плавающей запятой в качестве операндов (хотя два целых числа были бы в порядке). Отсюда и ошибка.

Если бы a и b были целыми числами, 0 and b было бы побитовым соединением 0 и b, то есть 0. Таким образом, у нас было бы

(a = 0) = 0.

Читается либо true = 0 (если a равно 0), либо false = 0 (если a отличается от 0). Но логическое значение нельзя сравнивать с целым числом, поэтому компилятор пожаловался бы на это.

Тем не менее, это было всего лишь академическим упражнением. Ясно, ваше намерение было

(a = 0) and (b = 0).

Просто добавьте круглые скобки:

if (b = 0) and (a = 0) then
  writeln('INFINITY')
1
Andreas Rejbrand 23 Ноя 2018 в 11:31