第2章程序结构
GeoGeo程序主体由函数构成,而函数由代码块构成,代码块由一条条的语句组成。有几个特殊环节需要特别注意。
代码控制等语句只支持语句块,不支持单独的一条语句。因此即使是只有一条语句也需要用大括号括起来,例如:
for( i=0; i<10; i=i+1){
sum= sum + i;
}
不能写成
for( i=0; i<10; i=i+1)
sum= sum + i;
同样,if else也不能写成
if(…){
…
}
else if (…){
…
}
else{
…
}
而应该写成
if(…){
…
}
else
{
if (…){
…
}
else{
…
}
}
虽然看起来麻烦了一点,但是为了统一使用语句块也牺牲一点吧。
goto语句也被去掉了,人们经常争议一个goto好不好什么的,这里压根就去掉。多重循环结束跳转可能麻烦一点,但是没有goto也不会有什么大问题。(这个问题留下来讨论,吼吼)
还有一些在圆括号里面条件短语声明变量的情况,总在争论里面有效还是外面有效,这里就干脆不允许了。因此,下面常用的c/c++语句
for( int i=0; i<10; i++)
现在应该写成
int i;
for(i=0; i<10; i = i+1)
还有,++、--这些非c/c++程序员看起来莫名其妙的东西,放在变量前面还是后面以及先加减后加减等,这里直接就也不允许了。
GeoGeo目标是为了简单,但并不是节省代码量,而是使其理解起来更清晰明确。
2.1常量
2.1.1整型常量
整型常量由阿拉伯数字构成,如“123”即表示一个值为123的整型数。整型常量可以直接为变量赋值:
int a = 123;
整型常量没有后缀修饰符。
2.1.2浮点型常量
浮点型常量由两种表示方式:小数表示方式和指数表示方式。小数表示方式如“3.14”即表示一个值为3.14的浮点数据;指数表示方式如“314.0E-2”,表示为314.0×10-2,也是3.14。浮点型常量也可以直接为变量赋值:
double a = 3.14;
double b = 314.0E-2;
浮点型型常量也没有后缀修饰符。
2.1.3字符型常量
字符型常量是由两个单引号“'”括起来的字符,通常被处理为无符号整型,如:
BYTE a = '0';
赋值后a的值为48,这是字母“0”在ASCII码表中对应的值。
注意,宽字符不能作为字符常量使用。
2.1.4字符串常量
字符串常量是由两个双引号“"”括起来的一个或多个字符,如:
STRING str = "沈阳农业大学李国春";
2.2操作符
2.2.1赋值操作符
赋值操作符由“=”号表示,其左侧必须是一个可以赋值的“左值”,或者说必须是一个变量,右侧是一个表达式。
赋值操作中GeoGeo隐含进行类型转换。
GeoGeo中不支持多重赋值和复合赋值,下述写法是非法的:
a = b = 10;
a += 10;
a++;
2.2.1算术操作符
算数操作符有:
+、-、*、/、%
GeoGeo没有增量、减量算数操作符
2.2.2关系与逻辑操作符
关系操作符有:
>、>=、<、<=、==、!=
依次为大于、大于等于、小于、小于等于、等于、不等于。
逻辑操作符有:
&&、||、!
依次为与、或、非。
2.2.3逗号操作符
逗号操作符“,”把若干表达式串在一起。
2.2.4圆点操作符
圆点操作符“.”指示对象(结构)成员。
2.2.5 ()操作符
圆括号操作符具有最高的优先级,用于提高括号内表达式的优先级。
2.2.5 []操作符
方括号操作符用于定义数组下标。
2.3表达式和语句
变量、常量和操作符等构成表达式,由表达式构成顺序、循环和跳转等各种类型的语句。
2.3.1表达式求值的优先级
表达式求值时如果有不同的数据类型,以精度最高的数据类型为准。例如,一个语句中同时有4字节整型数据和双精度浮点数据时,GeoGeo将表达式中数据转换到双精度浮点型再进行表达式求值。
2.3.2 if语句
if语句用于实现条件判断的跳转,表示为:
if (<条件>)<语句块> [else <语句块>]
if语句对条件表达式求值,求值结果为真时,执行if的语句块。求值结果为假时,执行else的语句块(如果有),或者继续向下执行程序。
注意if和else后面要求跟随语句块,而不是语句。语句块一定要求用大括号括起来。例如下述写法是合法的:
if(条件){
语句或语句组
}
else{
语句或语句组
}
去掉大括号的写法是非法的。
多个if else嵌套时,下面的写法是非法的:
if{
语句或语句组
}
else if{
语句或语句组
}
需要多重if嵌套时可以写成:
if{
语句或语句组
}
else{
if{
语句或语句组
}
else
{
语句或语句组
}
}
2.3.3 for、continue和break语句
for语句用于循环执行某一程序块,表示为:
for(<初始表达式>; <条件表达式>; <增量表达式>) { <需要重复执行的语句> }
初始表达式在开始for循环时执行一次,设置循环条件的初始值,一旦循环开始后就不再执行初始表达式。条件表达式在每次循环开始时执行,如果该表达式求值结果为“真”,则执行for循环的语句块,如果为假,则不执行for循环语句块,结束循环。增量表达式在每次执行for循环语句块之后执行,通常用于修改循环条件,控制循环结束。
初始表达式、条件表达式和增量表达式中使用的变量可以是预先声明的全局或者局地变量,不可以是表达式内临时声明的块内变量。例如:
int i;
for( i=0; i<10; i=i+1)
{
...
}
下述写法在GeoGeo中是非法的:
for(int i=0; i<10; i++)
{
...
}
这种写法有两处非法,1是在初始表达式使用了inti= 0这样的临时声明,2是在增量表达式中使用了GeoGeo不支持的增量操作符 i++。
continue语句通常用于循环语句中跳过循环块中的后续语句继续执行下次循环。
break语句通常用于循环语句中马上中止执行循环块中的任何语句,无条件终止循环,而不管条件表达式是否满足。
下面是一个for循环和congtinue、break语句的示例:
程序清单2.1 2-1-for循环.c
main(){
int n[2][3]={1,2,3,4,5,6};
int i,j;
Print("for循环与 continue语句的输出\n");
for(i=0; i<2; i=i+1){
for(j=0;j<3; j=j+1){
if(j%2) {
continue;
}
Print("%d\n",n[i][j]);
}
}
Print("for循环与 break语句的输出\n");
for(i=0; i<2; i=i+1){
for(j=0;j<3; j=j+1){
if(j%2) {
break;
}
Print("%d\n",n[i][j]);
}
}
}
运行代码,输出结果如下:
for循环与continue语句的输出
1
3
4
6
for循环与break语句的输出
1
4
2.3.4while语句和do while语句
while语句和do while语句也是用于控制循环的语句,while语句表示为:
while(<条件表达式>) { <需要重复执行的语句> }
条件表达式在每次循环开始时执行,如果该表达式求值结果为“真”,则执行while循环的语句块,如果为假,则不执行while循环语句块,结束循环。
下面是while循环的示例代码:
程序清单2.2 2-2-while循环.c
main(){
int n[4] ={1,2,3,4};
int i=0;
while(i<4){
Print("%d \n",n[i]);
i = i+1;
}
}
运行代码,输出结果如下:
1
2
3
4
do while语句表示为:
do { <需要重复执行的语句> }while(<条件表达式>) ;
do while语句与while语句的主要差异在于do while语句先执行循环块,后判断是否结束循环。
2.3.5return语句
return语句表示为:
return [<表达式>]
return语句用于函数的返回,函数有返回值时对表达式求值返回,函数没有返回值时不写表达式。
2.3.6赋值语句
赋值语句表示为:
变量 = <表达式>
2.4本章小结
1.整型常量在GeoGeo中被解释为4字节整型数据,浮点型常量被解释为8字节浮点数据,字符常量为单字节无符号整型,字符串常量为单字节或者双字节的串。
2. GeoGeo操作符与C类似。不支持多极赋值以及多操作符组合操作,如++、--、*=等。
3.表达式求值以表达式中精度最高的数据进行类型转换后进行,如2字节整型数据与4字节整型数据运算时先将2字节数据转换到4字节数值然后再进行运算。
4.条件语句、循环语句等语句的执行部分需使用语句块,不可以使用单独的语句。