您的位置:

c语言算术表达式的语法分析,c语言表达式计算

本文目录一览:

c语言的词法分析器

任务1:识别小型语言所有单词的词法分析程序设计

源程序设计语言

G[程序]

程序→变量说明BEGIN

语句表

END.

变量说明→VAR变量表:类型;|空

变量表→变量表,变量|变量

类型→INTEGER

语句表→语句

|

语句;语句表

语句→赋值语句|条件语句|WHILE语句|复合语句

赋值语句→变量:=算术表达式

条件语句→IF关系表达式THEN语句ELSE语句

WHILE语句→WHILE关系表达式DO语句

复合语句→BEGIN语句表END

算术表达式→项|算术表达式+项|算术表达式-项

项→因式|项*因式|项/因式

因式→变量|整数|(算术表达式)

关系表达式→算术表达式关系符算术表达式

变量→标识符

标识符→标识符字母|标识符数字|字母

整数→0|非零数字泛整数

泛整数→数字|数字泛整数|ε

关系符→|=|==||=|

字母

→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z

非零数字→1|2|3|4|5|6|7|8|9

数字→非零数字|0

空→

要求和提示:

词法分析阶段,可以打开任意位置和名称的源文件进行词法分析,可以进行非法字符和数字后边跟字母的错误判断,如果没有错误则提示“词法分析正确完成!”,并且可以选择输出token.txt(token文件)string.txt(符号表)两个文件;

1.词法分析程序的主要任务如下:

组织源程序的输入,识别出源程序中的各个基本语法单位(也称为单词或语法符号),按规则转换成二元式的形式;

删除无用的空白字符、回车符、及其它非实质性符号;

删除注解行;

为后面的语法和语义分析提供二元式链表;

单词

编码

单词

编码

标识符

1

15

正整数

2

=

16

BEGIN

3

17

END

4

=

18

IF

5

19

THEN

6

==

20

ELSE

7

21

WHILE

8

22

DO

9

:=

23

INTEGER

10

24

+

11

(

25

-

12

26

*

13

/

14

1)

对标识符的长度控制在8个字符(包括8个)以内,超过的做截断处理;

2)

数字不大于65535,否则报错;

3)

能跳过源程序中的空白格:两个单词之间的任何空格,制表符,回车,换行都是白空格,除了用来分隔单词以外,没有意义;

4)

能跳过注释:

a)

接连出现的/*到下一次接连出现的*/之间的任何文字都是注释(多行);

b)

从某行接连出现的//到该行的结尾的任何文字都是注释(单行)。

3.怎样编写词法分析程序:

1)

预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除注释,删除多余的白空格;

2)

从源程序字符数组中获得单词,

编码为二元式.:

二元式采用结构体数组存储,

把单词类型和词元记录下来。

分解单词的方法:

1)

Case多路转换语句根据单词的特点直接编写;

2)

通过描述单词的正规文法得到相应的有穷自动机,通过case多路转换语句完成有穷自动机的处理流程。

3.编写词法分析程序要注意的问题:

1)

检查词法是否有错误

检查是否有非法字符:如

@,

,

!

检查标志符和数字是否满足限制条件

检查注释符号是否配对

2)

符分隔单词

能够区分两个单词的符号为界符

有些界符不是单词:如白空格

有些界符仅仅用来分隔:如;

有些界符本身还是源程序不可缺少的单词,如(,

),

+,

/,

等等

有些界符包含两个字符:如,

=等等

3)

输出词法错误

如果有错误,需要报告词法错误的原因。并且要能够越过错误,分解下一个单词,直到源程序结束。

4)

输出的二元式流保存在二元式结构体数组中。

计算机c语言基础知识

   计算机c语言的特性

C语言是世界上最流行、使用最广泛的高级程序设计语言之一。在操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。C语言的主要特性有以下几种:

1、C是高级语言:它把高级语言的基本结构和语句与低级语言的实用性结合起来。

2、C是结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。

3、C语言功能齐全:具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。

4、C语言适用范围大:适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。

5、C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性。

6、C语言创始人D.M.Ritchie6、C语言文件由数据序列组成:可以构成二进制文件或文本文件常用的C语言IDE有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc,xcode等。

   计算机c语言的语法结构

1.顺序结构

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构。

2.选择结构

选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。

3.循环结构

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。

4.模块化程序结构

C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。

   计算机c语言基础知识

【知识点1】C程序

C语言程序结构有三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)

【知识点2】main函数

每个C语言程序中main 函数是有且只有一个。读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。

【知识点3】存储形式

计算机的数据在电脑中是以二进制的形式保存。最低的存储单元是bit(位),位是由为 0 或者1构成。 byte 是指字节, 一个字节 = 八个位。数据存放的位置就是它的地址。

【知识点4】注释

是对程序的说明,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,注释不可以嵌套。

【知识点5】书写格式

每条语句的后面必须有一个分号,分号是语句的一部分。一行内可写多条语句,一个语句可写在多行上。

【知识点6】标识符

合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了。

C语言标识符分如下3类

(1)关键字。它们在程序中有固定的含义,不能另作他用。如int、for、switch等。

(2)预定义标识符。预先定义并具有特定含义的标识符。如define、include等。

(3)用户标识符。用户根据需要定义的标识符,符合命名规则且不与关键字相同。

关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If 是可以做为用户标识符。因为If 中的'第一个字母大写了,所以不是关键字。

【知识点7】实型数据

实型数据的合法形式:小数形式和指数形式。掌握判定指数形式合法性。

2.333e-1 就是合法的,且数据是2.333×10-1。

考试口诀:e 前e 后必有数,e 后必为整数。

【知识点8】字符

字符数据的合法形式::

'1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。

'0' 的ASCII 数值表示为48,'a' 的ASCII 数值是97,'A'的ASCII 数值是65。

字符型和整数是近亲:

char a = 65 ;

printf(“%c”, a); 得到的输出结果:a

printf(“%d”, a); 得到的输出结果:65

一般考试表示单个字符错误的形式:'65' "1"

字符是可以进行算术运算的,记住: '0'-0=48

大写字母和小写字母转换的方法: 'A'+32='a' 相互之间一般是相差32。

【知识点9】整型数据

整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节:

考试时候一般会说,在16 位编译系统,或者是32 位系统。碰到这种情况,不要去管,

一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节就可以了。

【知识点10】转义字符

转义字符的考查:

在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x 必须存在。

在程序中 int a = 06d, 是一个八进制的形式。

在转义字符中, ’x6d’ 才是合法的,0 不能写,并且x 是小写。

‘141’ 是合法的, 0 是不能写的。

‘108’是非法的,因为不可以出现8。

【知识点11】算术运算

算术运算符一共有+、—、*、/、%这五个。%符号两边要求是整数。不是整数就错了。

三种取整丢小数的情况:不是四舍五入是舍掉小数部分。

1、int a =1.6;

2、(int)a;

3、1/2; 3/2;

【知识点12】强制类型转换

将一个运算对象转换成指定类型,格式为(类型名)表达式

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b) 和(int)a+b 的区别。前是把a+b 转型,后是把a 转型再加b。

【知识点13】赋值

是表达式就一定有数值。

赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

复合赋值运算符:注意:a*=m+2 是 a=a*(m+2)

自加、自减表达式:假设a=5,++a(表达式的值为6), a++(表达式的值为5);

j=a++;等价于j=a;a=a+1; 而j=++a;等价于a=a+1;j=a;。

考试口诀:++在前先加后用,++在后先用后加。

【知识点14】逗号运算

逗号表达式:优先级别最低; 表达式的数值逗号最右边的那个表达式的数值。

(2,3,4)的表达式的数值就是4。

【知识点15】数制转换

一定要记住二进制 如何转换成十进制。

八进制是没有8 的,逢8 进1,018 的数值是非法的。

【知识点16】位运算

会有一到二题考试题目。

C语言提供6种位运算符:按位求反~,按位左移,按位右移,按位与,按位异或|,按位或^。

总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

异或运算的规则:0异或1得到1,0异或0得到0,1异或1得到0。可记为“相同为0,不同为1”。

在没有舍去数据的时候,左移一位表示乘以2;右移一位表示除以2。

C语言知识总结

c语言概要

第一章、 概述

1、 c语言的基本知识

1.1、 c语言的执行步骤

编辑-程序代码的录入,生成源程序*.c

编译-语法分析查错,翻译生成目标程序*.obj

(语法或逻辑错误,从第一个开始改,变量定义,语句格式,表达式格式等)

链接-与其他目标程序或库链接装配,生成可执行程序*.exe

执行

1.2、 main函数的基本知识

main()函数的位置

c程序总是从main( )函数开始执行

一个c程序可以包含一个主函数,即main()函数;也可以包含一个main()函数和若干其它函数

1.3、 c程序的结构

函数与主函数

程序由一个或多个函数组成

必须有一个且只能有一个主函数main()

程序执行从main开始,在main中结束,其他函数通过嵌套调用得以执行

程序语句

C程序由语句组成

用“;”作为语句终止符

注释

//

/* */ 为注释,不能嵌套

不产生编译代码

1.4、c 程序书写的规则

习惯用小写字母,大小写敏感

不使用行号,无程序行概念:通常一个语句占一行

可使用空行和空格

常用锯齿形的书写格式;同一层次结构的语句上下对齐。

第二章、基本数据类型与运算

2.1、c程序的数据类型

注意类型和变量含义的不同(类型是固定好的名字,变量是自己起的名字)

变量占用的存储空间

数据类型

基本类型:整型、字符型、浮点型(单精度型,双精度型)

构造类型:数组类型、结构体类型

指针类型

空类型

注意基本类型赋初值的方式

基本数据类型的表示形式

整形数据

十进制:以非0数字开头,如:123,-9,0

八进制;以0数字开头,如:0123,067

十六进制:以0x开头,如:0x123,0xff

实型数据

十进制:必须带小数点,如:123.0,-9.0

指数形式;如:1.23E3,0.9e-2,5e2

字符型数据

普通字符:如:’a’,’2’,’H’,’#’

转义字符:如:’\n’,’\167’,’\xlf,’\\’

(实现几列的对齐:指定宽度。如%100\ ‘\t’制表位)

(字符串长度。“abc\n\t\\” strlen 6; sizeof 7)

基本数据类型的存储长度

整型

Int 字节数 2 位数 16 数的表示范围 -32768—32767

Short 2 16 -32768—32767

Long 4 32 -2147483648—2147483647

实型

Float 4 32 3.4e-38---3.4e38

Double 8 64 1.7e-308---1.7e308

字符型

Char 1 8 -128----127

2.2、标识符命名规则

C语言标志符命名规则

标识符有数字,字母,下划线组成

标识符的首字符必须为字母和下划线

标识符不能为c语言的保留字(关键字)

如:auto extern sizeof float static case for struct char goto switch continue in typedef const if union default long unsigned do register void double return else short while enum signed

算术运算符 + - * / %

关系运算符 == = = !=

逻辑运算符 ! ||

位运算符 ~ | ^

赋值运算符 = 及其扩展赋值运算符

条件运算符 ? :

逗号运算符 ,

指针运算符 *

求字节数运算符 sizeof

强制类型转换运算符 (类型)

分量运算符 . -

下标运算符 [ ]

其他 如函数调用运算符()

运算符的优先级

由高到低:单目运算符,算数运算符,关系运算符,赋值运算符

说明:单目运算符:自增运算符,自减运算符,类型装换运算符。结合方向:自右至左

如:++--I 先—i.。

算术运算 结合方向自左至右

2.3基本运算和表达式

关系表达式和逻辑表达式

(ab)(xy) (a==b)||(x==y) !=a||(ab)

Ab.a为0.不执行b

A||b a为1.不执行b

在 c 中逻辑运算结果:1代表“真”,0代表“假”;

判断一个表达式是否真:0代表“假”,非0代表“真”

条件表达式 逗号表达式

如:k=5,k++

逗号值为5;k为6.

表达式1?表达式2 :表达式3

K=56 ? 1 : 0

2.4、混合运算的数据类型转换

2/3+0.5 双精度浮点型

第三章、顺序结构程序设计

3.1、c语句的分类

简单语句

表达式语句 表达式+分号

空语句 只有分号的语句

复合语句 用花括号将若干语句括起来

流程控制语句

选择语句 if ,switch

循环语句 while, do while , for

转移语句 break ,continue ,return goto

3.2、格式输入函数scanf

一般形式:scanf(“格式控制字符串“,地址列表);

使用scanf函数时,需要注意:

格式字符的个数必须与输入项的个数相同,数据类型必须一一对应,非格式字符串(说明性的)要原封不动的输入。

输入实行数据时,可以不带小数点,即按整型数据输入

数值型数据与字符或字符串混合输入时,需要注意输入方式。

3.3、格式输出函数printf

Printf(“格式控制字符串“,输出列表);

指定输出格式,由格式字符串和非格式字符串两种组成,非格式字符串照原样输出。

%[标志][输出最小宽度][.精度][长度]类型

标志:- 左对齐;+ 右对齐;

%f, %d, %c, %s

3.4、其他输入输出函数

Putchar getchar puts gets

第四章、选择结构程序设计

If选择结构

单分支

If(表达式)

语句

双分支

If(表达式)

语句1

Else

语句2

多分支

If (表达式1)

语句1

Else if(表达式2)

语句2

。。。

Else if(表达式m)

语句m

Else

语句n

Switch(表达式)

{

Case 常量表达式1:语句1;break;

Case 常量表达式2:语句2;break;

。。。

Case 常量表达式m:语句m;break;

Default:语句n;break;

}

注意break的使用

第五章、循环结构程序设计

循环三要素

初始条件 ;终止条件 ;在初始条件和终止条件间反复做某件事情(循环体)

While(表达式)

语句

Do

语句

While(表达式);

For(循环体变量赋初值;循环条件;循环变量增量)

( for( ) ; // ; 进行时间延迟。在信息交换等时用。如for(i=0,i100) ; 互相通讯的时间延迟。 Delay )

Break语句 :不能用于循环语句和switch语句之外的任何其他语句;跳出循环。

Continue语句 :跳过循环体中剩余的语句而强行执行下一次循环;跳出本次循环。

第六章、函数与编译预处理

6.1、函数的定义和调用

类型标识符 函数名 (形式参数列表)

{ 声明部分

语句

}

例:

Int max (int x,int y)

{int z;brZ=xy?x:y;brReturn(z);}

6.2、局部变量和全局变量

注意函数中静态变量的定义和使用

6.3、变量的存储类型

局部变量的存储类型

自动变量(auto) 动态存储

局部静态变量(static) 静态存储

寄存器变量(register) 静态存储

全局变量的存储类型

自动变量(auto) 动态存储

外部变量 (extern) 静态存储

全局静态变量(static )静态存储

Extern 外部引用

Static 不能用extern 引用。

第七章、数组

7.1、一维数组的定义和使用

特别需要注意循环体的初值,终止条件

例:

Main()

{

Int I,a[10];

For(i=0;i=9;i++)

A=I;

For(i=9;i=0;i--)

Printf(“%d”,a);

}

注意下标问题

7.2、二维数组的定义和使用

二维数组的初始化

例如:

Int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

Int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

Int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};

Int a[ ][4]={{1,2,3,4},{5},{9,10,11,12}};

例如:int a[3][3]={{1},{2},{3}};

是对每一行的第一列元素赋值,未赋值的元素取0

7.3、字符数组和 字符串

字符串用字符数组来处理,结束标志符 ‘\0’

如:char c[ ]={“I am happy”};

用字符串常量使字符数组初值化

Char c[ ]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0’};

第八章、指针

8.1、地址和指针的概念

Int I;

Int *i_point;

8.2、指针变量和变量的地址

操作符:*

8.3、指针和一维数组

若有定义

Int a[10];

Int *p=a;

分析下面表达式的含义:

A, a,

*(a+i), a+I,

*(p+i), p+i

A=*(a+i)=*(P+i)

a=a+i=p+i

8.4、指针与字符串

Main()

{

Char string[ ]=”I love china!”;

Printf(“%s\n”,string);

}

Main()

{ char *string=”I love china!”;

Printf(“%s\n”,string);

}

8.5、指针变量作为函数参数

形参的定义方式;实参的形式;参数的传递方式。

第九章、结构体

9.1、结构体类型和变量的定义

Struct 结构体名

{成员列表};

Struct student

{char stuNO[8];brChar name[20];brChar sex;brInt age;brFloat score;brChar addr[30];br};

Stuct student

{char stuNO[8];brChar name[20];brChar sex;brInt age;brFloat score;brChar addr[30];br};

Struct student stu1, stu2;

9.2、结构体变量的引用

一般形式为:

结构体变量名.成员名

9.3、结构体数组

结构体数组 结构体数组元素.成员名

指向结构体的指针变量

(*p).成员名

p-成员名

其他

Strcpy(字符数组1,字符串2)

Strcat(字符数组1,字符数组2)

Strcmp(字符串1,字符串2)

Strlen(字符数组)

C语言介绍

C语言的发展过程

C语言是在70年代初问世的。一九七八年由美国电话电报公司(ATT)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《KR》,也有人称之为《KR》标准。但是,在《KR》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。

当代最优秀的程序设计语言

早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。

C语言的特点

C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。

C语言版本

目前最流行的C语言有以下几种:

·Microsoft C 或称 MS C

·Borland Turbo C 或称 Turbo C

·ATT C

这些C语言版本不仅实现了ANSI C标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。

面向对象的程序设计语言

在C的基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C++目前流行的最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2.0。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。

C和C++

但是,C是C++的基础,C++语言和C语言在很多方面是兼容的。因此,掌握了C语言,再进一步学习C++就能以一种熟悉的语法来学习面向对象的语言,从而达到事半功倍的目的。

C源程序的结构特点

为了说明C语言源程序结构的特点,先看以下几个程序。这几个程 序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本部分和书写格式。

main()

{

printf("C语言世界,您好!\n");

}

main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,且只能有一个主函数(main函数)。函数调用语句,printf函数的功能是把要输出的内容送到显示器去显示。printf函数是一个由系统定义的标准函数,可在程序中直接调用。

c语言(m=a>b)&&(n=c>d),a=5,b=6,c=7,d=8,m=2,n=2,运算后m= ,n= ?

首先你应该明白运算的优先级,包括逻辑运算与算术运算。注意,在c语言中是非0即1的思路,这里根据C语言语法分析:

ab = 0, 后面是与运算,到此程序应该结束,表达式为0。最后结果:m=0, n=2

求助,关于c语言的。

C语言基础(01-引言及预备知识): C语言是一门功能强大的编程语言,它也是C++语言的基础。C语言属于中级语言。这里所说的中级是相对于计算机的底层硬件而言的。汇编语言是最低级的语言,它可以直接与硬件打交道。高级语言有Pascal、Basic、Fortran等等。高级语言的一条语句对应低级语言的很多条语句,任何高级语言编写的程序都要经过编译程序的编译、连接才能成为可以运行的程序。编译连接的过程也就是把高级语言翻译成机器语言(二进制机器码)的过程,而汇编语言是基本上与机器语言一 一对应的一种语言。这个翻译过程是由编译程序自动完成的。把C语言定为中级语言是有它的道理的,因为C语言既有汇编语言的存取底层硬件的能力,又具有高级语言的许多特点。熟练掌握了C语言,学习其它的各种编程语言应该是很轻松的了。

C语言的书写格式:

1) 一个C语言编写的源程序,必定有一个主程序(称为main()函数,在C语言中子程序称为“函数”(当然,不要理解成为数学里面的“函数”)。但是决不能有一个以上的main函数(即只能有一个)。

2) 函数语句块用‘{’括号开始, 以‘}’反括号结束。这样的花括号必须成对出现。

3) 表达式写在小括号里面,以‘(’括号开始,以‘)’反括号结束。

4) 函数不能嵌套,即函数里面不能再套函数。(每一个函数是完成一个特定功能的函数模块)

C语言的组成:

C语言是由许多函数组成的。其中只有一个主函数(main()函数)。C程序执行时总是从main函数的‘{’处开始,至main函数的反大括号'}'处结束。当然还有其它一些规则,这将在以后的学习中去熟悉它。

C语言的书写规则:

C语言在书写时有它自身的特点:书写格式比较自由,在一行里可以写多条语句,一个语句也可以分写在多行上。虽然如此,在书写源程序时还是要注意哪些可以自由书写,而哪些必须要按照书写规则来书写。

几条规则写在下面:

1) 一行内可以写几个语句,建议一行不超过两条语句;

2) 一条语句可以写在多行上;

3) C语句不需要写行标号;

4) 每条语句及数据定义的后面要写上分号以表示该语句结束;

5) C语言中注释用 /* */来表示;

6) 建议书写时采用缩进格式;

7) 花括号、小括号都是成对出现的。

一个最简单的C程序的编写:

/* 程序代码*/ /* 注释部分*/

main() /*main是主函数名。紧跟在main后面的括号是放参数的。

括号里面为空说明main函数不需要参数*/

{ /*正写的大花括号表示main函数从这里开始*/

} /*反写的大花括号表示main函数到这里结束*/

说明:由于是一个演示程序,在函数体内并没有任何可以执行的语句,也就是这个程序什么事也不做。

这个程序就是这么简单: 写在一行上就是 main() { }

你在TC的编辑环境下把这段代码输入进去,按F9键编译连接,按CTRL_F5运行,一定很正常。但是什么结果也不会有,因为在main函数里面什么代码也没有。

下面再举一个可以向屏幕上输出一条信息的例子:

main()

{

printf("这就是C语言编写的程序!"); /*这一条语句的作用是向屏幕输出一条信息

”这就是C语言编写的程序!"*/

}

在这个程序中,main函数只有一条语句:printf("这就是C语言编写的程序!");这个语句的作用是向屏幕输出一个字符串。有关这个语句的知识以后再讲。现在要注意的是一个C语言程序的框架是怎样组成的。

C语言程序的几种文件格式:

1、 源程序---在TC集成环境中输入的程序文本称为源程序。源程序是一种文本文件。它是我们看得见并认识的一种文件。其扩展名为.C。例如你把文件保存为TEST,那么在磁盘上应看得到TEST.C这个文件。这样的文件可以用记事本打开。

2、二进制文件---写完了源程序后接着要做的是编译这个文件。在TC集成环境里是按ALT_F9键,编译后生成了一个二进制文件,这个二进制文件名为TEST.OBJ,也就是扩展名为OBJ的目标文件。

3、运行文件---最后一步是make(或Link),在TC集成环境里是按F9键Make之后生成了一个可以在DOS下运行的文件,其扩展名为EXE。如TEST.EXE。这个EXE文件是由第2步中的OBJ文件生成的。OBJ文件虽然是二进制文件,而电脑又是可以运行二进制文件的,为什么还要把OBJ文件Link为EXE文件才能运行?这里的知识就比较多了,这里不能多讲。但是要明白一点,在DOS下仅仅有了一个二进制文件还不能运行,因为操作系统要把这些二进制文件加以规划,把相应的数据、程序代码放到应该放的内存位置,这样的经过严密规划和组织好了的二进制文件才能运行。而这些只有在生成的EXE文件里面才做完了这些工作。

---------------------------------------

作业题:

1、下列程序中格式错在( )处。

A. main() B. int a,b,z;

C. a=2:b=3; D. z=a+b;

分析:A,B,D 没有错误。 C 中在a=2后面应该是分号而不应是":"号

答: C

2、C语言允许将一条语句写在两行上,下列语句不正确的是

A. int a,

B;

B. int a

,b;

C. int

a,b

D. int a,b

;

分析:C语言规定可以在语句中的任何一个分隔符或空格处换行。上面4个选项中D.有问题因为在D.中第一行的最后没有分隔符,而第二行只有一个分号,可以看做一个语句。所以D中的错误为:第一行是一个独立的语句,但是少了一个分号。

答: D

3. C语言的一行写不下时,可以

A. 用逗号换行 B. 用分号换行

C. 在任意一空格处换行 D. 用回车符换行

分析:C语言可以在任何一个分隔符或空格处换行,所以此题的正确答案是 C

答: C

4. 下列程序段中,哪一个是错误的注释方法?

A. #in/*包含*/cludestdio.h

void main()

{

}

B. #includestdio.h

void main/* */(/*主函数*/)

{

}

C. #includestdio.h

void main()

{ int x/*初始化*/=10;

/*打印*/printf("%d",x);

}

D. #includestdio.h

void main()

{

int x=10;

printf("%d",x);

/*打印x的值*”*=10*/

}

分析:根据C语言的规定:注释不能插在标识符的中间,在其它有分隔符的地方都可以插入注释,上面四个程序段中只有A是将注释插入在标识符的中间了。所以A是错误的。

答: A

5. C语言程序是由( )组成的?

答:C程序是由函数组成的。

6. C程序运行时,运行的是什么文件?

数据的类型:

在程序中要处理大量的数据,把这些数据按其特点分为几种基本的数据类型,它们分别是:

1 、整型 2 、字符型 3 、实型

还有其它的一些扩展的数据类型,但是开始学习时要先熟悉这三种基本数据类型。

在 C 语言中这几种数据类型用符号表示如下:

整型数据类型 int /* 一般指可以运算的数,如自然数就是整型数据类型 */

字符数据类型 char /* 一般指文字,如英文字母;字符类型的 '1''2''3''4' 等 */

实型 float /* 也称作浮点型,记住 float 类型的数都是有小数位的,如 425.23*/

常量和变量:

常量――程序运行过程中其值不变的量,如一个整数 134, 一个字符 ‘a'

变量――程序运行过程中其值可以变化的量,如 int a; char b; 那么 a 和 b 都是变量。

符号常量 ――用一个“符号”来表示的一个“常量”称为“符号常量”。

符号常量有什么好处 ――在给符号常量命名的时候,按习惯取的名字与实际上的含义相符,可以“见名识意”;另外在需要修改常量的值的时候,只需要修改符号常量的定义部分即可,非常方便。

符号常量的定义方法 ―― #define 符号 常量

例: #define NUMBER 30 /* 定义了一个符号常量,在这里是用符号 NUMBER 表示整数 30 ,以后在程序里就可以

用符号 NUMBER 代替整数 30 进行运算 */

main()

{

int a=20; /* 把常量 20 赋给整型变量 a*/

int c; /* 定义了整型变量 c*/

c=NUMBER+a; /* 变量 c 的值此时为 50 ,符号常量 NUMBER 参与了运算 */

}

变量的定义方法 ――在变量的名字前面加上一个变量的数据类型,以说明已定义的变量可以用来存放什么样类型的数据。

例: int a; /* 定义了一个整型变量,以后这个变量只能存放整型类型的数 */

char b; /* 定义了一个字符型变量,以后这个变量只能存放符字符型数据 */

怎样把常量值赋给已定义了的变量 ――用一个 = 号赋值。

例: int a; /* 定义一个整型娈量 a*/

char b; /* 定义了一个字符型变量 b*/

a=20; /* 用 = 号完成赋值,赋值后变量 a 的值此时为 20*/

b='d' /* 把常量字符 'd' 赋给变量 b ,此时变量 b 的值是字符 'd'*/

变量赋值时一种更灵活的方法 ――可以在一行上给多个相同数据类型的变量赋值,变量之间用逗号分隔。

例: int a,b,c,d; /* 定义了 4 个整型变量 */

char e,f,g; /* 定义了 3 个字符型变量 */

深入理解变量 ―― 1 ) 1 个变量必须有一个变量名。 2 )变量必须有其指定的数据类型

3 )变量一旦被定义,它就在内存中占有一个位置,这个位置称做该 变量的地址 。

4 )每一个变量都有其对应的值。

l 一定要牢记变量的这 4 个特性。

变量使用时的注意事项 ―― 1 )变量在使用之前一定要先定义,使用一个没有定义的变量是错误的。

2 )变量必须在一个函数的开始部分定义。(这个限制在 C++ 中不存在)

例题:写一个 2 个整数相加的程序。

/* 解题思路:求 2 个整数相加,必定要先定义 2 个变量来存放这 2 个数,另外还需要 1 个变量用来存放

相加的和,所以共需要定义 3 个整型变量 */

/* 注意每次在写 C 程序的时候一定要注意书写格式 */

main()

{

int a,b,c;

a=20,b=30; /* 在这里指定变量的值,因为还没有讲输入输出函数,只能这样了。 */

c=a+b;

}

想一想,这样简单的一个题,需要知道的知识面却不少。 用到了上面所讲的哪些知识?

C语言中的库函数――我们编写C语言程序时要写许多代码,这些代码是用基本程序语句如运算符、表达式、几种语句结构来组成。这些语句组成了多个不同的函数,由多个函数组成一个完整的程序。实际上如果程序中的语句都要由自己来写的话,那么工作量是很大的了。并且有一些完成基本任务的函数如输入输出函数是经常需要使用的。这样的一些常用的完成基本任务的函数有许多已经由提供编译程序的公司为我们写好了。这些已经写好的函数放在TC或者BC编译器的文件中。所谓“库函数”,就是存放“函数”的“仓库”。在TC中,函数的“仓库”在哪里呢?在TC的.\LIB目录中。编写程序的时候,如果我们需要使用某个库函数,就要在这个程序开头指明这库函数存放在哪里,以便让编译程序到这个地方去找。这个指明库函数路径的语句称为“包含”语句,写做#include。完整的写法是:

#include stdio.h

#include 是包含的意思,stdio.h 是指明要使用的库函数在 stdio.h这个文件里面有说明。尖括号是必须要写的。而实际上,编译程序在stdio.h之个文件里根据库函数名可以在.\LIB目录下的LIB文件里找到相关的代码,写进程序里面去。使用不同的库函数时要用不同的包含,关于怎样使用#include,可以查看库函数的帮助。

有了众多的库函数,给编写程序带来了很大的方便。就象做房子要用砖和瓦一样。如果没有砖和瓦,做房子自己要挖土烧砖,可想而知,那样做房子的难度有多大。写程序也是这样,有了库函数,在需要完成某些任务时,找到相应的库函数调用一下就可以了,不需要自己一点一点的写代码。在学习编程的同时要多多了解一些库函数的特点及用法,对编写程序是有很大的好处的。

(在Windows下编写程序,需要了解的“库函数”就更多了,可以说不了解库函数就不会编程。VC中用的是MFC,Win32中用的是API,它们都是函数库)

先了解二个库函数――1、scanf函数 /*格式化控制台输入函数*/

函数原型:int scanf(control_string....); /*看上去很复杂。没关系,以后自然会明白的*/

使用例:

void main()

{

int a,b,c; /*定义了三个整型变量*/

scanf("%d%d",a,b); /*从键盘输入二个整数到娈量a和b中*/

c=a+b; /*把变量a与b相加的和送给变量c*/

}

下面仔细讲一下scanf函数各参数的用法:

可以看到在小括号里有二个%d,后面有二个变量a和b。二个%d的写法为"%d%d",注意凡是这样的符号都要写在双引号里面,而变量则写在双引号的外面并用逗号分隔。这个%d我们称为格式化说明符,第一个%d用于说明第一个变量a,第二个%d用于说明第二个变量b,这样的顺序是一一对应的。%d格式符说明了后面输入的变量值是整型数。

另外注意的是二个%d是靠在一起的 %d%d,凡是这样的写法,在输入数时,对于二个数之间的分隔是用“空隔键”来实现的。如输入30和50这二个数形式为 30 50 如果二个%d写成%d,%d中间有一个逗号,那么在输入数据时也一定要在输入的数之间加上逗号,如 30,50。

再来看一下变量的写法,可以看到在每一个变量名的前面都有一个号,这个号是取变量地址的意思,那么a写在一起就是变量a的地址,b写在一起就是变量b的地址。

上面的scanf函数的作用就是把从键盘上输入的二个整数分别送到变量a和变量b的地址里面去。这个号是非常重要,不要写漏了。

scanf函数的格式说明符(格式说明符说明了下一步将读的是什么类型的数据)

格式码 含义

%c 读一单字符

%d 读一整数

%i 读一个浮点数

%e 读一个浮点数

%f 读一个浮点数

%g 读一个浮点数

%o 读一个八进制数

%s 读一字符串

%x 读一十六进制数

%p 读一指针

%n 读一个指针收一个等于到目前为止输入的字符数止的整数

%u 读一无符号整数

%[] 扫描一字符集

例:从键盘输入二个字符,一个大写,一个小写,然后把这个小写字符转换成大写,大写字符转换成小写。

#includestdio.h /*因为在程序里用到了库函数scanf,所以要使用包含#includestdio.h*/

void main()

{

char ch,chh; /*定义了二个字符型变量*/

scanf("%c%c",ch,chh); /*从键盘输入二个字符,一个大写,另一个小写*/

ch=ch+32; /*大写转成小写*/

chh=chh-32; /*小写转成大写*/

}

2、printf函数 /*格式化输出函数*/

函数原型:int printf(const char *control_string....);

说明:printf把变量的值或常量字符串输出到控制台(一般是显示屏)

使用例:

#includestdio.h

void main()

{

int a,b,c;

scanf("%d%d",a,b);

c=a+b;

printf("输出二个整数相加的和"); /*输出字符串常量,这里没有用到格式化说明符*/

printf("%d",c); /*把变量c的值用整型格式输出,这里%d是整型格式说明符*/

}

如果有几个变量的值要输出,用这样的形式:printf("%d %d %d",a,b,c);

从这个printf输出的格式中看出,每一个格式符对应一个变量,其对应顺序也是一一对应的,第一个%d对应第一个变量a,以此类推。注意在printf函数中,变量前面就不要加符号了。

注意printf函数中几个%d之间留了一些空格,这里的用法与scanf相比有一点不同。在printf函数中格式符之间留多少空隔,输出的时候每一个输出的值之间就有多少空隔。如printf("%d %d %d",a,b,c);输出则为:20 30 50 (这里的数是假设的)。如果写为printf("%d,%d,%d",a,b,c);则输出形式为 20,30,50

printf函数的格式符:

格式码 格式

%c 单个字符

%d 十进制数

%i 十进制数

%e 科学法表示

%E 科学法表示

%f 十进制浮点数

%g 用%e或%f中较短的的一个(如果是%e,用小写e)

%G 用%e或%f中较短的的一个(如果是%E,用大写E)

%o 以八进制形式输出

%s 字符串

%u 无符号十进制数

%x 十六进制数(小写)

%X 十六进制数(大写)

%p 显示一个指针

%n 相关变量是整型指针,它所指处存放至今要写入字符的总数

%% 打印一个%号

printf函数使用例:

1)char ss="abcdefghijk"; printf("%s",ss); /*输出一个字符串,屏幕上显示"abcdefghijk"*/

2)unsigned int a=65535; printf("%u",a); /*以十六进制形式输出一个无符号数,显示为ffff*/

3)int a=123,b=456,c=687; printf("%d\t%d\n%d",a,b,c);

输出形式为:

123 456 /*'\t'是一个制表符,所以要移动一个制表位这么多空格数*/

687 /*'\n'是换行转义符,在前面字符常量里讲过。所以要换一行再输出687*/

C语言基础(05-运算符和表达式):运算符(也叫操作符)--运算符是一个表示特定的数学或逻辑操作的符号。如'+'号,表示了一个相加运算;''号表示了一个逻辑‘与’的运算。由运算符把需要进行运算的各个量(常量或变量)连接起来组成一个表达式。

下面要讲的是标准的运算符,在C++中还有另外的一些运算符。运算符 进行的运算 所属类别 备注

[ ] 间隔符 标点符号

( ) 间隔符 标点符号

· 直接分量选择 双目操作符

- 间接分量选择 双目操作符

++ 前增量、后增量 单目操作符

-- 前减量、后减量 单目操作符

+ 加 双目操作符、单目操作符

- 减 双目操作符、单目操作符

* 1)乘 2)间接引用 双目操作符、单目操作符

/ 除 双目操作符

% 求余 双目操作符

1)位‘与’2)取地址 双目操作符、单目操作符

! 逻辑‘非’ 单目操作符

逻辑‘与’ 双目操作符

|| 逻辑‘或’ 双目操作符

左移位 双目操作符

右移位 双目操作符

小于 双目操作符

大于 双目操作符

== 等于 双目操作符

!= 不等于 双目操作符

^ 位‘异或’ 双目操作符

+= 和赋值 双目操作符

-= 差赋值 双目操作符

*= 乘赋值 双目操作符

/= 商赋值 双目操作符

= 左移赋值 双目操作符

= 右移赋值 双目操作符

= 按位‘与’赋值 双目操作符

^= 按位异或赋值 双目操作符

|= 按位或赋值 双目操作符

%= 模赋值 双目操作符

= 赋值 双目操作符

?: 按条件取值 双目操作符

, 间隔符 标点符号

# 预处理符号 标点符号

## 预处理符号 标点符号

sizeof 求字节数

~ 按位求反

| 位‘或’

: 间隔符

; 间隔符

... 间隔符

要把表中的运算符仔细的分类是不容易的,因为同一个运算符,在不同的地方其含义是不同的。如*运算符,当作为乘运算时是双目操作符(所谓双目操作符,即运算时需要二个操作数),如3*6,那么3与6总共是二个操作数。当作为取值运算时就是单目操作符(所谓单目操作符是只需要一个操作数)如对一个数求反:!a,这里只有一个操作数a。

要记住运算符的二个特点,一个是运算符的操作对象,另一个就是运算符的优先级别。其中运算符的优先级别是最不容易搞清楚和最容易出错的地方。

在讲运算符之前讲一下“表达式”的概念:所谓表达式,就是用运算符把各个操作数连接成符合C语法规则的进行运算的式子。这里说的“符合C语法的规则”也很重要。如 a+b+5就是一个用算术运算符连接起来的表达式。

1、算术运算符:+、-、*、/、%

1)+、-、*、/ 分别是相加、相减、相乘、相除

2)% 求二个数运算的模。所谓求模就是求二个数相除后的余数。例:25/3的余数是1,可以说25%3的模是1。要注意的是求模运算时二个操作数必须是整数。如果求25.3/3.1这样是不能运算的。

下面写一个例子:

#includestdio.h /*程序中要用到输入输出库函数,所以包含了stdio.h*/

void main()

{

int a=10,b=20,c=30; /*定义了3个整型变量,并同时进行了初始化赋值*/

a=a*b+c; /*a*b+c组成了一个算术表达式,运算后的结果为230并把值*/

/*赋给变量a*/

printf("%d",a); /*以整型格式输出变量a的值。这里输出230*/

a=a%b; /*进行求模运算。因为没有余数,最后的模为0*/

printf("%d",a); /*输出变量a的值。这里输出0*/

}

下面是一个要考虑运算符优先级的例子:

#includestdio.h

void main()

{

int a=10,b=20,c=30;

a=c-a*b; /*这里就要考虑运算符优先级,*运算符的优先级比-运算符*/

/*的高,所以先进行乘运算。这里最后结果为-170*/

}

由上面这个例子看到,在一个有多个运算符连接起来的表达式中需要考虑运算符的优先级,这个例子很简单。关于运算符优先级的概念其实在小学生的算术运算中就有这样的概念了,只不过这里的运算符多了一些,要考虑的情况也就复杂了。

如果这个式子改写一下,写成:a=(c-a)*b;在运算时就以括号中的运算优先。

几个简化的运算表达式:

在C语言的程序中,经常看到这样的运算,如:i++;或者k--;这是运算符号的简化写法。

1、加1运算的简写

当一个变量进行加1运算时,如a=a+1;这是变量自身加1,简写为a++;

2、减1运算的简写

当一个变量进行减1运算时,如a=a-1;这是变量自身减1,简写为a--;

3、加1个常量运算的简写

当一个变量与一个常量相加时,如a=a+5;这是变量自身加5,简写为a+=5;

4、减一个常量运算的简写

当一个变量与一个常量相减时,如a=a-5;这是变量自身减5,简写为a-=5;

5、乘一个常量运算的简写

当一个变量与一个常量相乘时,如a=a*5,这是变量自身乘5,简写为a*=5;

6、除一个常量运算的简写

当一个变量与一个常量相除时,如a=a/5;这是变量自身除5,简写为a/=5;

运算符的结合性(或称作关联性)

在一个复杂的表达式中,常常有许多运算符和变量,这时就要判断优先级和结合性这二个因素。

例:-5+7; 这样的一个表达式用结合性来判断,因为运算符'-'和'+'相对于运算的数来说是‘左’结合的,所以就有'-5'和'+7'所以运算的结果为 2。

通过这个例子要知道什么是“左结合性”和“右结合性”

左结合性--变量(或常量)与左边的运算符结合

右结合性--变量(或常量)与右边的运算符结合

运算符的优先级和结合性表

优先级 运算符(高 ------→低) 结合率 运算符类型

高 ( ) [ ] - . 从左至右 双目运算符

! ~ ++ -- (类型) sizeof + - * 从右至左 单目运算符

* / % 从左至右 双目运算符

+ - 从左至右 双目运算符

从左至右 双目运算符

= = 从左至右 双目运算符

== != 从左至右 双目运算符

从左至右 双目运算符

^ 从左至右 双目运算符

| 从左至右 双目运算符

从左至右 双目运算符

|| 从左至右 双目运算符

?: 从右至左 三目运算符

低 = += -= *= /= %= = ^= |= = = 从左至右 双目运算符

高 -------------→ 低

从表中可以看出一个规律,凡是单目运算符都是“右结合”的,凡是双目运算符都是“左结合”的。其中有一个?:运算符是三目运算符是右结合的,记住了这个规律,运算符的结合性也就掌握了。

如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。

由于将表熟记是比较困难的,为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。例如:

d = (high 8) | low /*用括号把需要先运算的括起来*/

if ((a | b) (a c)) /*用括号把需要先运算的括起来*/

例:

下列程序输出的结果是

#includestdio.h

void main()

{

int a=2;

a%=4-1;

printf("%d",a);

a+=a*=a-=a*=3;

printf("\n%d",a);

}

A. 2,0 B. 1,0

C. -1,12 D. 2,12

分析:由于%=运算符的优先级别低于-运算,a%=4-1即是a%=3,等价于a=a%3即a=2%3=2,所以选项B和C是错误的。表达式a+=a*=a-=a*=3,计算时注意赋值类表达式的值和变量的值随时被更新,计算表达式的值,开始时a=2,表达式赋值是从左至右进行的,表达a*=3使得a=6,此表达式的值也为6,于是表达式a-=a*=3相当于a-=6=6-6=0,a的值为0,后面的计算就不用做了,所以a的值最终为0。

答:A

下列语句中错误的是

A.x=sizeof int;

B.x=sizeof 3.14

C.printf("%d",a=a+1,b--,c+1);

D.printf("%d",++x,x++);

分析:此题的选项A的作用是测试int类型所占内存的字节数,因为类型符要用括号括起来,这时缺少括号是错误的。

选项B是正确的。

选项C从表面上看似乎复杂一些,但其中的a=a+1,b--,c+1是一个逗号表达式,C语言允许使用这种表达式所以D也是正确的。

答案:A

下面的语句中,符合C语言语法的赋值语句是

A.a=7+b+c=a+7; B.a=7+b++=a+7;

C.a=7+b,b++,a+7; D.a=7+b;c=a+7;

分析:一般情况下,表达式不能放在赋值号的左边,所