您现在的位置:小学生自学网>> 信息>> pascal语言>> 基础教程

PASCAL第五讲:赋值语句

作者: 来源: 发布时间:2009年05月12日 点击数:
 

赋值语句
〖语法分析〗

  PASCAL有两个语句可以改变变量的值。赋值语句是其中之一(另一个是读语句)。赋值,顾名思义,就是把一个值赋予某个量。可以这理解:变量相当于装东西的容器,赋值的过程就是把东西放进容器的过程。赋值语句格式如下:
   变量:=表达式;
   写赋值语句有以下几点要注意:

   1、赋值号“:=” 
    赋值号由两个字符构成,是一个运算符。如果把这两个字符拆开,那么这两个字符就是别的意思了:“:”是分隔符而“=”是关系运算符,判定两个对象是否相等。刚刚写程序的同学要特别注意这一点。
   例:a,b:integer;——是一个说明语句。“:”是变量表和变量类型的分隔符
     a=b——是一个表达式。它的值是一个布尔类型的量:TRUE或FALSE
     a:=3;——是一个语句。把整型常量值3赋给整型变量a
     X:=1; 把1这个数值赋给X这个变量;
     A:=B*C+12*INT(D); 把B*C+12*INT(D)这个表达式的值赋给变量A;
     Y:=Y+1; 把Y+1的值再赋给Y这个变量, 即累加。
     以下赋值语句都是错误的:
     S:=T:=1; 不能有两个赋值号在一个语句中;
     X+2:=4; 赋值号左边不能是表达式;
     Z=3; 少了冒号;
由上可以看出,赋值语句实际上是先把等于号右边的表达式计算出,再赋给赋值号左边的变量。

 

   2、变量要先说明
  在赋值号左边出现的变量,要在程序头的说明部先加以说明,否则编译时出错。

   3、表达式必须要有确定的值
    赋值号右边出现的表达式,必须是可以求值的。也就是说,经过运算之后,能得出一个具体的、确定的值出来。大家想一想,如果连表达式自己都不知道自己的值是多少,怎么还能把值“赋予”别人呢?

以下程序的作用是先把A,B两个变量赋上值(3和2),打印在屏幕上;然后再交换它们的值,再打印在屏幕上:

Program L31;
var a,b,c:integer;
begin
a:=3;
b:=2;
writeln(’a=’,a,’ ’,’b=’,b);
c:=a;
a:=b;
b:=c;
writeln(’a=’,a,’ ’,’b=’,b);
readln;
end. 这边程序说明、解释,大家不用输入。
这时刚说明A,B,C三个变量,值均为0
程序开始
这时A的值为3
这时B的值为2
此句为打印语句,结果在输出屏幕上
这时C的值为3
这时A的值为2
这时B的值为3, 此时A,B的值已经交换
打印语句
等待用户敲回车键继续
程序结束
 

上述程序是一个比较简单的顺序结构的程序,希望大家看懂程序每一句的作用,进一步理解PASCAL程序的语法规则。在程序运行过程中各变量数值变化的情况如程序右边。从上述程序中还可以看出,一个变量如果本身已经被赋过值,当再次赋值时,原来的值就不起作用,而被新的值所覆盖。

   4、赋值号两边的数据类型必须相同或相容
  我们知道,PASCAL中的量不管是变量还是常量都有一个属性称为“数据类型”。数据类型相同的或相容的才可以相互赋值。
    怎么来理解这句话呢?打个比方,我们沏功夫茶用的是小茶杯,装饭时用饭碗。如果用饭碗来泡功夫茶,用小茶杯来装饭,那情形一定很滑稽而且是不可行的。回到PASCAL中来,赋值号左边变量如果是整型,右边表达式的值的类型也要是整型;赋值号左边变量如果是字符型,右边表达式的值的类型也要是字符型……否则的话,也要出错了。这是数据类型相同的情况。
    对于数据类型相容的,我们也可以用一个例子来帮助理解。我们都喝过功夫茶,也喝过大杯茶。把功夫茶倒在大茶杯里,一般不会出什么问题;但如果把大杯里的茶倒在功夫茶杯里呢?可能小茶杯装不下大茶杯里的茶,茶“溢出”了。在PASCAL中也会出现这种情况。当一种数据类型的取值范围包含着另一种数据类型的取值范围时,就可能出现类型相容的情况。如实型与整型,整型、字符型与它们各自的子界类型……如果把整型值赋给实型变量,把整型子界值赋给整型变量,不会出错;但如果反过来,就会出现“溢出”,出错了。
    因些,我们在写赋值语句时,要注意两边的类型是否匹配。
    例:有程序如下: 

Program q32; 

Var I,j,k:integer; 

R:real; 

S:string; 

Begin 

I:=123.456; 

R:=146; 

R:=trunc(1231.54346); 

K:=6/3; 

S:=123; 

S:= ’ aasd ’ +1234; 

End. 
  

说明 I, J, K三个变量是整数型; 

R是实数型; 

S是字符串型; 

程序开始 

错误:因为 I是整数型变量,不能把一个实数型数值赋给它; 

正确: 146也是一个实数; 

正确: trunc这个函数的返回值是整数型的,可以赋给实数型变量; 

错误: 6/3虽然得到的值是 2,但这个 2是实数型,而不整数型的; 

错误: S是字符串型变量,而 123是数值型值; 

错误:表达式中不能把字符串与数值相加。 

程序结束 

总结:

数学上的“=”不同。X:=X+1,指将X的值加上1后再赋给X。PASCAL中的“=”为关系运算符。X=(X+1)为假。 
赋值号两边的数据类型必须相同。 
变量必须赋初值后才能引用。(系统默认数字为0,字符为空格,布尔值为FALSE) 
例1:下列赋值语句那些是错的?错在哪里?(var : x,y,z,a: integer; ) 

   ① x:=x+y    ② x=y+z   ③ x+y:=z

例2:写出下列程序的运行结果 

var a,b,c:integer; 

begin 

a:=5; b:=8; 

c:=a; a:=b; b:=c; 

writeln(’a=’,a,’? ’,’b=’,b) 

end. 


思考题:如果不引入第三个中间变量,能否交换两个变量的值?编程序试一试。 

  

学习两个过程: 

① inc(x,n) 等价于 x:=x+n   ② dec(x,n) 等价于 x:=x-n 
    inc(x)  等价于 x:=x+1      dec(x) 等价于 x:=x-1?