Линейное уравнение, несовместимые типы BOOLEAN / LONGINT - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть упражнение по линейному уравнению в Паскале, и я создал простой код для сравнения входных чисел, но когда я пытаюсь его запустить.У меня проблема с несовместимыми типами 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"

1 Ответ

0 голосов
/ 23 ноября 2018

По крайней мере, в современных 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')
...