获得"布尔"预期"LongInt"帕斯卡

use*_*626 3 pascal boolean bubble-sort insertion-sort long-integer

我的插入排序算法出现此错误:

insertionsort.lpr(19,17)错误:不兼容的类型:得到"布尔"预期"LongInt"

这是我的代码的第19行

 while j > 0 and A[j]>key do            
Run Code Online (Sandbox Code Playgroud)

我试过在互联网上搜索谷歌,但我找不到任何语法错误或任何东西.

如果它有帮助,这是完整的代码:

program instert;
uses crt;
const
  N = 5;
var
   i:integer;
   j:integer;
   key:integer;
   A : Array[1..N] of Integer;


procedure insertionsort;
  begin
  for i := 2 to N  do
    begin
    key := A[1];
    j:= i - 1;
        while j > 0 and A[j]>key do
        begin
          A[j+1] := A[j] ;
          j := j-1;
        end;
    A[j+1] := key ;
   end;
 end;

begin
  A[1]:= 9;
  A[2]:= 6;
  A[3]:= 7;
  A[4]:= 1;
  A[5]:= 2;
  insertionsort;
end.
Run Code Online (Sandbox Code Playgroud)

我在冒泡排序算法上也得到了同样的错误.这是错误行

bubblesort.lpr(26,14)错误:不兼容的类型:得到"布尔"预期"LongInt"

这是我算法的第26行:

 until flag = false or N = 1 ;   
Run Code Online (Sandbox Code Playgroud)

这是完整的代码:

program bubblesort;
uses crt;

var
  flag:boolean;
  count:integer;
  temp:integer;
  N:integer;
  A : Array[1..N] of Integer;

procedure bubblesort ;
begin
  Repeat
    flag:=false;
    for count:=1 to (N-1)  do
    begin
    if A[count] > A[count + 1] then
       begin
       temp := A[count];
       A[count] := A[count + 1];
       A[count] := temp;
       flag := true;
       end;
    end;
    N := N - 1;
  until flag = false or N = 1 ;
end;

begin
  A[1]:= 9;
  A[2]:= 6;
  A[3]:= 7;
  A[4]:= 1;
  A[5]:= 2;
  N := 5;
  bubblesort;
end.
Run Code Online (Sandbox Code Playgroud)

lur*_*ker 7

以帕斯卡,布尔操作符andor具有更高的优先级比所述比较操作符>,=等,所以在表达式:

while j > 0 and A[j] > key do
Run Code Online (Sandbox Code Playgroud)

鉴于and优先级较高,Pascal将其视为:

while (j > (0 and A[j])) > key do
Run Code Online (Sandbox Code Playgroud)

0 and A[j]被计算为按位and(因为参数是整数),从而得到一个整数.然后该比较,j > (0 and A[j])被评价为布尔结果,留下的,与检查> key,这是boolean > longint.然后,您将获得longint预期的错误,而不是boolean算术比较的错误.

修复它的方法是括号:

while (j > 0) and (A[j] > key) do ...
Run Code Online (Sandbox Code Playgroud)

同样的问题适用于此声明:

until flag = false or N = 1 ;
Run Code Online (Sandbox Code Playgroud)

产生错误的原因or是优先级高于=.所以你可以括起来:

until (flag = false) or (N = 1);
Run Code Online (Sandbox Code Playgroud)

或者,对于布尔运算更具规范性:

until not flag or (N = 1);    // NOTE: 'not' is higher precedence than 'or'
Run Code Online (Sandbox Code Playgroud)

当对运算符的优先级有疑问时,括号内是一个好主意,因为它消除了对将要发生的订单操作的疑问.