c语言字符变量表达式6,C语言笔记(一)--- 基本类型、运算符、表达式、分支结构及循环控制、scanf、printf介绍...

一. C语言概述

1. 只有32个关键字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed static sizof struct switch typedef union unsigned void volatile while

Turbo C 扩充了11个关键字: asm _cs _ds _es _ss cdecl far hugeinterrupt near pascal

2. 语法限制不太严格,程序设计自由度大

3. 中级语言

C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此有人把他称为 中级语言 。

4. 生成目标代码质量高,程序执行效率高。

5. 对程序员的要求也高。

6. 简单的C程序介绍:

main() {

printf("hello world!\n");

}

解析:

a ) main是主函数的函数名,表示这是一个主函数

b)每一个C源程序都必须 有,且只能有 一个 main函数

c)函数调用语句,printf函数 的功能是把要输出的内容送到显示器上去显示。

d)printf函数 是一个由系统 定义的标准函数 ,可以直接调用。

#include

#include "stdio.h"

main() {

double x,s;

printf("input number:\n");

scanf("%lf",&x);

s=sin(x);

printf("sine of %lf is %lf",x,s);

}

解析:

a ) #include 称为文件包含命令

b)扩展名为 .h 的文件称为头文件

c)定义两个实数变量,以被后面程序使用。

d)显示提示信息

e)从键盘获得一个 实数x

f)求 x 的正弦,并把他赋给 变量s

g)显示程序运算结果

h)main函数结束

在 main() 之前的两行 #include 称为 预处理指令 。

预处理指令 还有其他几种,这里的 include 称为 文件包含命令 ,其意义是把 尖括号<> 或 引号"" 内指定的文件包含到本程序中来,成为本程序的一部分。被包含的文件通常是系统提供的,其扩展名为 .h 。因此也称为 头文件 或 首部文件 。

7. 输入和输出函数

前面的例子中用到了 scanf 和 printf 。

它们被称为格式输入函数和格式输出函数。

使用格式为:

printf("格式字符串",参数表)

例如,前面例子中的 %lf 为格式字符,表示按双精度浮点数处理。

他在格式串中出现2次,对应了x和s两个变量。

8. 注释符号

注释符号是 /* */

9. C源程序的结构特点

1)一个C语言源程序可以由一个或多个源文件组成

2)每个源文件可由一个或多个函数组成

3)一个源程序不论由多少个文件组成,都有 一个且只能有一个 main函数 ,即 主函数

4)源程序中可以有 预处理指令(include 命令仅为其中的一种),预处理指令 通常应放在源文件或源程序的最前面。

5)每一个说明,每一个语句都必须以分号结尾。但 预处理命令 、函数头 和 花括号"}" 之后不能加分号

6)标识符、关键字之间必须至少有一个空格以示间隔。

10. C语言的字符集:

字符是组成语言的最基本的元素。

C语言字符集由字母、数字、空格、标点和特殊字符组成。

在字符常量、字符串常量和注释中还可以使用汉字或其他可表示的图形符号。

11. C语言词汇:

在C语言中使用的词汇分为6类:

标识符 、 关键字 、 运算符 、 分隔符 、 常量 、 注释符 等。

11.1 标识符

标识符 只能由字母、数字和下划线_组成,并且第一个字母不能是数字。

需要注意的是:

a)标准C不限制标识符的长度,但他受各种版本的C语言编译系统限制,同时也受到具体机器的限制。

b)在标识符中,大小写是区别的。

c)命名是任意的,但是最好人为的“顾名思义”。

11.2 关键字

也称为 保留字 。

分为 类型说明符(例如 int double )、语句定义符(例如 if else )、预处理命令字(例如 include )等

二. 程序的灵魂--算法

数据结构+算法=程序

三. 数据类型、运算符与表达式

1. 数据类型

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

枚举类型

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

指针类型

空类型 : void

2. 常量与变量

2.1 常量

直接常量,如 10,0,4.6,'a' 等

标识符常量(符号常量),即用标识符代表一个常量。

在C语言中,可以用一个标识符表示一个常量,称之为符号常量。

符号常量在使用之前必须先定义:

#define 标识符 常量

习惯上符号常量的标识符使用大写字母。

例如:

#define PRICE 30

...

total=num*PRICE;

3. 变量 由变量名 变量值和存储单元组成。

4. 整型常量的表示方法:

1)十进制整常数:例如 237、-56、65535 等,但不能以 0 开头,如 023 是错误的,因为在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。

2)八进制整常数:以 0 开头,且通常是无符号数。如:015 0101 0177777 ,

下面是错误的:256(没有以 0 开头)03A2(错误数码) -0127(出现了负号)

3)十六进制整常数:以 0X 或 0x 开头,如 0x2a , 0XA0 0XFFFF ,

以下是错误的:5A(没有前缀)、0X3H(含义非法代码)

4)整型常数的后缀:在16位字长的机器上,基本整型的长度也只有16位,表示数的范围是有限的,所以如果超出了 0-65535 的范围,就必须使用长整型数来表示。使用后缀 L 或 l 。例如:

十进制长整常数:158L,358000L

八进制长整常数:012L 077L 0200000L

十六进制长整常数:0x15L 0xA5L 0x10000L

C编译系统将为他分配 4个字节 存储空间。而对基本整型只分配 2个字节,因此在运算和输出格式上要予以注意,避免出错。

无符号数也可用后缀表示,使用 U 或 u ,例如 358u , 0x38Au , 235Lu 均为无符号数。

5. 整型变量

数值是以补码表示的。

1)正数的补码和源码相同。

2)负数的补码:将该数的绝对值的二进制形式按位取反再加1.

例如求-10的补码:

10的源码是 00000000 00001010

取反 11111111 11110101

+1 11111111 11110110

由此可知,左面的第一位是表示符号的。

6. 整型变量的分类:

1)基本型:int 占2个字节

2)短整型:short int或short,所占字节和取值范围与基本型相同

3)长整型:long int或long,占4个字节

4)无符号型:unsigned,无符号型又可与上述三种类型匹配而构成:

a) 无符号基本型 unsigned int或unsigned

b) unsigned short

c) unsigned long

各种无符号类型所占的内存空间字节数与相应的有符号类型相同。

但由于省去了符号位,故不能表示负数。

有符号整型变量最大表示32767,无符号最大表示65535

7. 整型数据的溢出

例如:

int a,b;

a=32767;

b=a+1;

printf("%d,%d\n",a,b);//输出32767,-32768

另外,长整型和基本整型之间允许进行计算,运算结果为长整型,但可以把长整型转换为基本整型,这是由编译系统自动完成的。但可能会溢出。

8. 实型数据

也称为浮点型。

在C语言中,实数只采用十进制。

他有2种形式:十进制小数形式 和 指数形式 。

1)十进制数形式:如 0.0 25.0 5.789 0.13 5.0 300. -267.8230

注意:必须有小数点

2)指数形式:由十进制数,加阶码标志 e 或者 E 以及阶码(只能为整数,可以带符号)组成。

一般形式为: a E n,其值为a*10的n次方。

以下不是合法的实数:

345(无小数点) E7(E之前没有数字) -5(无E标志) 53.-E3(负号位置不对) 2.7E(E后无数字)

标准C允许浮点数使用后缀 f 或 F 表示该数为浮点数,如 356f 和 356. 是等价的。

9. 实型变量

实型变量占4个字节。

按指数形式存储。

实数 3.14156 在内存中存放形式如下:

+ .314156 1

分别表示 数符 小数部分 指数

小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。

指数部分占的位数愈多,则能表示的数值范围愈大。

10. 实型变量的分类

分为单精度 float 和 双精度 double 和 长双精度 long double ,

在Turbo C中,float 占 4个字节(32位),只能提供7位有效数字。

double 占 8个字节,可提供16位有效数字,

long double 占 16个字节,有效数字19位。

11. 实型数据的舍入误差

由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。

如下例:

main() {

float a,b;

a=123456.789e5;

b=a+20;

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

printf("%f\n",b);

}

注意:1.0/3*3的结果并不等于1.

main() {

float a;

double b;

a=33333.33333;//由于有效位数只有7位,而整数位已占5位,故小数二位之后均为无效数字

b=33333.33333333333333; //b是双精度型,有效位是16位,但Turbo C规定小数后最多6位,其余部分四舍五入

printf("%f\n%f\n",a,b);

}

12. 实型常数的类型:都按double型处理。

13. 字符常量

字符常量只能使用 单引号',不能使用 双引号" 或 其他括号 。

只能是 单个字符 。

字符可以是字符集中的任意字符。

但数字被定义为字符型之后就不能参与数值运算,如 '5' 和 5 是不同的。

14. 转义字符

\n 表示回车换行=10

\t=9 \b=8 \r=13 \f=12 \\=92 \'=39 \"=34 \a=7

\ddd=1-3位八进制数所代表的字符

\xhh = 1-2位十六进制数所代表的字符

15.

字符变量使用 char a,b; 表示

16. 字符数据在内存中的存储形式及使用方法

每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。

如 x 的十进制ASCII码是120,y 的十进制ASCII码是121,对字符变量a,b赋予'x' 'y'值:

a='x';b='y';

实际上 a,b两个单元内存放120和121的二进制代码。

所以也可以把他们看成是整型量。

C语言允许对整型变量赋予字符串,也允许对字符变量赋予整型值、在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。

当把整型量按字符量处理时,只有低八位字节参与处理。

例如:

char a,b;

a=120;

b=121;

printf("%c,%c\n",a,b);

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

可以看出printf函数格式串中的格式符决定了输出的是字符还是整型。

又如:

char a,b,;

a='a';

b='b';

a=a-32;

b=b-32;

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

由于大小写字母差32,所以这个是把小写字符转换为大写字符。

17. 字符串常量

字符串常量使用 双引号" 括起来。

在C语言中没有相应的字符串变量,这是与BASIC语言不同的,但是可以用一个字符数组来存放一个字符串常量。

字符常量占一个字节空间,字符串常量占的内存字节数等于 字符串中字节数+1。

增加的一个字节存放 \0 (ASCII码为0),这是字符串结束的标志。

18. 变量赋初值:

int a=3;

int b,c=5;

float x=3.2,y=3f,z=0.75;

char ch1='K',ch2='P';

注意:在声明变量时不允许连续赋值,如 int a=b=c=5 是不合法的。

19. 各类数值型数据之间的混合运算

变量的数据类型是可以转换的,一种是 自动转换,一种是 强制转换 。

自动转换发生于不同数据类型混合运算时由编译系统自动完成。

遵循以下原则:

1)若参与运算量的类型不同,则先转换成同一类型再进行运算。

2)转换按数据长度增加的方向进行,以保证精度不降低,如int和long型运算时,先把int转换成long型

3)所有的浮点运算都是以双精度型进行的,即使仅含float单精度量运算的表达式,也是先转换成double型,再做运算。

4)char型和short型参与运算时,必须先转换成int型

5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

强制类型转换:如(float)a ; (int)(x+y),使用强转时注意:

1)类型说明符和表达式都必须加括号(单个变量可以不加)

2)无论是强转还是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

20. 算数运算符和算数表达式:

1)算术运算符:+ - * / % ++ -- ,其中 + 具有右结合性,- * / 具有左结合性。

2)关系运算符: > < == >= <= !=

3)逻辑运算符: && || !

4)位操作运算符:& | ~ ^ << >>

5)赋值运算符: = += -= *= /= %= &= |= ^= >>= <<=

6)条件运算符: ?:

7)逗号运算符:用于把若干表达式组合成一个表达式 ( , ) .

8)指针运算符:用于取内容( * )和取地址( & ) 2种运算。

9)求字节数运算符:用于计算数据类型所占的字节数( sizeof );

10)特殊运算符: 括号() 下标[] 成员(→,.) 等几种。

注意: /运算符 根据参数的不同返回结果也不同,参数是整型,返回结果也是整型,参数有一个是浮点型,则返回结果就是双精度型。

%求余运算符 要求参数都是整型, 结果也是整型。

21. 运算符的优先级

具有15级,1级最高,15级最低,优先级较高的先执行。

优先级相同时,按照运算符的结合性所规定的结合方向处理。

22. 运算符的结合性

分左结合性和右结合性。

例如,算数运算符的结合性是自左至右,即先左后右,如有表达式 x-y+z ,则y应先与-号结合,执行x-y,再执行+z的运算。这就是左结合性。

最典型的右结合性运算符是赋值运算符,如 x=y=z ,先执行 y=z 再执行 x=(y=z) 运算。

C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

23. 强类型转换运算符 (类型说明符) (表达式)。

24. ++ -- 具有右结合性。

即 ++i 是先自增再参与运算,i++ 是先参与运算再自增。

例如:

int i=5,j=5,p,q;

p=(i++)+(i++)+(i++);

q=(++j)+(++j)+(++j);

结果 p=15 q=24 ,其中 q 相当于 j 先自增再参与元素,j 自增3次后变成8,然后 q=24 .

25. 赋值运算符和赋值表达式

赋值运算符具有右结合性,即先计算 = 右边的表达式,然后把结果赋给左边的变量。因此 a=b=c=5 可理解为 a=(b=(c=5)) .

在C中,把 “=” 定义为运算符,从而组成赋值表达式。凡是表达式可以出现的地方均可出现赋值表达式。例如:

x=(a=5)+(b=8); 是合法的,他的意义是把5赋给a,把8赋给b,再把a,b相加赋给x。

按照C语言规定,任何表达式在其末尾加上 分号; 就构成为语句,因此如 x=8;a=b=c=5; 都是赋值语句。

26. 类型转换:

1)实型赋予整型 将舍弃小数部分。

2)整型赋予实型:小数部分为0.

3)字符型赋予整型:高八位为0的整型。

27. 逗号运算符

表达式1,表达式2 :表示分别求两个表达式的值,并以表达式2的值做为整个逗号表达式的值。例如:

main() {

int a=2,b=4,x,y;

y=(x=a+b),(b+c);

printf("y=%d,x=%d",y,x);

}

注意:

1)逗号表达式一般形式中的表达式1和表达式2也可以又是逗号表达式,即允许嵌套。因此,可以把逗号表达式扩展为以下形式:

表达式1,表达式2,...,表达式n

2)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

并不是在所有出现逗号的地方都组成逗号表达式,如在变量声明中,函数参数表中逗号只是用作变量之间的间隔符。

四. 最简单的C程序设计--顺序程序设计

1. C程序的结构

C程序包含多个源程序文件;每个源程序文件由预处理指令、全局变量声明、函数1,。。。函数n组成;函数由函数首部和函数体组成;函数体由局部变量声明和执行语句组成。

1)表达式语句以 ; 结尾

2)函数调用语句:由函数名、实际参数加上 ; 组成。一般形式为 函数名(实际参数表);

3)控制语句:if、switch、do while、while、for、break、goto、continue、return 。

4)复合语句:{} 括起来的语句。在程序中把复合语句看成单条语句,而不是多条语句。复合语句内的语句以 ; 结尾,但 {} 外不再加分号

5)空语句:只有一个 ; 的语句,可用来做空循环体。

2. 赋值语句

变量=(变量=表达式); 是允许的,因此 a=b=c=5; 也是允许的,但是在变量声明中,如 int a=b=c=5; 是错误的,必须使用 int a=5,b=5,c=5;

注意赋值表达式和赋值语句的区别:

赋值表达式是一种表达式,他可以出现在任何允许表达式出现的地方,而赋值语句则不能。

下述语句是合法的:

if((x=y+5)>0) z=x;//合法

if((x=y+5;)>0) z=x;//非法;因为x=y+5;是语句,不能出现在表达式中。

3. 数据输入输出的概念以及在C语言中的实现:

1)所谓输入输出是以计算机为主体而言的。

2)本章所介绍的是向标准输出设备显示器输出数据的语句

3)在C语言中,所有的数据输入/输出都是由库函数完成的。因此都是函数语句。

4)在使用C语言库函数时,要用预编译指令 #include ,标准输入输出函数要引用 #include 或 #include "stdio.h"

考虑到 printf 和 scanf 函数使用频繁,系统允许在使用这两个函数时可以不加 #include

4. 字符数据的输入输出:

1)putchar(字符变量) 对控制字符则执行控制功能,不在屏幕上显示。

使用本函数前必须使用 #include

char getchar();

使用 getchar 时注意:

a)只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符

5. 格式输入与输出:

printf函数 :printf("格式控制字符串",输出表列) 其中格式控制串以 % 开头,% 后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:

%d = 按十进制整型输出

%ld = 按十进制长整型输出

%c = 按字符型输出等。

输出表列给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。

2)格式字符串:在TurboC中格式字符串的一般形式为:

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

其中 [] 的项为可选项。

各项的意义介绍如下:

a)类型:

d = 十进制有符号整数(整数不输出符号);

o = 八进制输出无符号整数(不输出前缀 0 );

x,X = 十六进制输出无符号整数(不输出前缀 0x )

u = 十进制输出无符号整数;

f = 以小数形式输出单、双精度实数

e,E = 以指数形式输出单、双精度实数

g,G = 以 %f 或 %e 中较短的输出宽度输出单、双精度实数。

c = 输出单个字符

s = 输出字符串

b)标志:

标志字符为 - + # 空格 四种,

其意义如下:

- = 左对齐,右边填空格

+ = 输出符号(正号或负号)

空格 = 输出值为正时冠以空格,为负时冠以负号

# = 对c s d u 类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀 0x ;对 e g f类当结果有小数时才给出小数点。

c)输出最小宽度:

用十进制整数来表示输出的最少位数。

若实际位数多于定义的宽度,则按实际位数输出;否则补以空格或0.

d)精度:

精度格式符以 "." 开头,后跟十进制整数。

本项的意义是:

如果输出数字,则表示小数的位数;

如果输出的是字符,则表示输出字符的个数;

若实际位数大于所定义的精度数,则截去超过的部分。

e)长度:

长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。

如:

main() {

int a=15;

float b=123.1234567;

double c=12345678.1234567;

char d='p';

printf("a=%d,%5d,%o,%x\n",a,a,a,a);

printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);

printf("c=%lf,%f,%8.4lf\n",c,c,c);

printf("d=%c,%8c\n",d,d);

}

使用 printf函数 时还要注意一个问题,那就是输出表列中的求值顺序。

不同的编译系统不一定相同,可以从左到右,也可以从右到左。

TurboC是从右到左的。请看下面的例子:

main() {

int i=8;

printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);

}

表达式计算是自右向左,但显示依然是自左向右,注意理解。

3)scanf函数(格式输入函数)

scanf函数 的一般形式为:scanf("格式控制字符串",地址表列);

其中,格式控制字符串的作用与 printf 相同,但是不能显示非格式字符串,也就是不能显示提示字符串。

地址表列中给出各变量的地址。

地址是由 地址运算符& 后跟变量名组成的,例如&a &b 分别表示 变量a 和 变量b 的地址。

这个地址就是编译系统在内存中给a b变量分配的地址,在C语言中,使用了地址这个概念,这是与其他语言不同的。

应该把变量的值和变量的地址这两个不同的概念区分开来。

变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

&a 实际上是一个取值表达式,表示获取 变量a 的内存地址;

例如:

main() {

int a,b,c;

printf(" input a,b,c\n");

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

printf("a=%d,b=%d,c=%d",a,b,c);

}

由于 scanf函数 本身不能显示提示串,所以先用 printf 语句在屏幕上输出提示,请用户输入a、b、c的值。

执行 scanf 语句,则退出TC屏幕进入用户屏幕等待用户输入。

用户输入7 8 9后按下回车键,此时系统又将返回TC屏幕。

在 scanf 语句的格式串中由于没有非格式字符在 "%d%d%d" 之间做为输入时的间隔,因此在输入时要用一个以上的空格或回车键做为每两个输入数之间的间隔。

4)scanf的格式字符串:

一般形式为 %[*][输入数据宽度][长度]类型

a)格式:

d = 十进制整数

o = 八进制整数

x = 十六进制整数

u = 无符号十进制整数

f或e = 输入实型数(小数形式或指数形式)

c = 单个字符

s = 字符串

b)"*" 符号:

用来表示该输入项,读入后不赋予相应的变量,即跳过该输入值,如 scanf("%d %*d %d",&a,&b); 当输入1 2 3时,把1赋予a,2被跳过,3赋予b。

c)宽度:

用十进制整数指定输入的宽度(即字符数)。

例如 scanf("%5d",&a); 输入12345678,只把123456赋予变量a,其余部分被截去。

又如 scanf("%4d%4d",&a,&b); 输入12345678,将把1234赋予a,5678赋予b。

d)长度:

长度格式符为 l 或 h

l 表示输入长整型数据(如 %ld )和双精度浮点数( %lf )。

h 表示输入短整型数据。

使用 scanf函数 还必须注意以下几点:

a)scanf 中没有精度控制,如:scanf("%5.2f",&a) 是非法的。不能企图用此语句输入小数2位的实数。

b)scanf 中要求给出变量地址,如果给出变量名则会出错。如 scanf("%d",a) 是非法的,应该是scanf("%d",&a);

c) 在输入多个数值数据时,若格式控制串中没有非格式字符做为输入数据之间的间隔则可用 空格、TAB或回车 做为间隔。C编译在碰到 空格、TAB、回车或非法数据 (如对 "%d" 输入12A时,A即为非法数据)时即认为该数据结束。

d)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

例如:scanf("%c%c%c",&a,&b,&c); 输入 d e f,则把'd'赋予a,' '空格赋予b,'e'赋予c。

只有当输入为def时,才会分布赋予d e f。

如果在格式控制中加入空格做为间隔,如 scanf("%c %c %c",&a,&b,&c); 则输入时各数据之间可加空格。

e)如果格式控制串中有非格式字符则输入时也要输入该非格式字符。

例如:scanf("%d,%d,%d",&a,&b,&c); 则应输入5,6,7; 又如 scanf("a=%d,b=%d,c=%d",&a,&b,&c); 则输入应为 a=5,b=6,c=7

f) 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。

五,分支结构程序

1. 关系运算符:

k==j==i+5 ,根据运算符的左结合性,先计算 k==j ,该式不成立,其值为0,再计算 0==i+5 ,也不成立,故表达式为0.

2. 逻辑运算符

&& || !

&& 和 || 均为双目运算符,具有左结合性。

! 为单目运算符,具有右结合性。

逻辑运算符和其他运算符优先级的关系可表示如下:

! > 算数运算符 > 关系运算符 > &&和|| > 赋值运算符。

! > && > || , &&和||低于关系运算符,! 高于算数运算符。

按照运算符的优先顺序可以得出:

a>b && c>d 等价于 (a>b)&&(c>d)

!b==c || d

a+b>c&&x+yc)&&((x+y)

3. 逻辑运算的值

逻辑运算的值也为“真”和“假”两种,用“1”和“0”来表示。

虽然C编译在给出逻辑运算值时,以1表示真,以0表示假,但是反过来在判断一个量是真还是假时,以0表示假,以非0值表示真。

例如 5&&3 的值为“真”,即为1.

4. if语句:

if(表达式) 语句

if(表达式)

语句1;

else

语句2;

if(表达式)

语句1;

else if(表达式2)

语句2;

else if(表达式3)

语句3;

...

else if(表达式m)

语句m;

else

语句n;

在使用 if语句 时还应注意以下问题:

a)if 后面的表达式通常是逻辑表达式,但也可以是其他表达式,如赋值表达式等,甚至也可以是一个变量。如 if(a=b) printf("%d",a); else printf("a=0"); 本语句的意义是把b的值赋予a,如果非0则输出该值,否则输出a=0字符串。这种用法在程序中是经常出现的。

if语句的嵌套:

if(表达式1)

if(表达式2)

语句1;

else

语句2;

这个else究竟是与哪个if配对呢?C语言规定,else总是与他前面最近的if配对。

条件运算符和条件表达式

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

a) 条件运算符的运算优先级低于关系运算符和算数运算符,但高于赋值符。因此 max=(a>b)?a:b; 可以写成 max=a>b?a:b;

b) 条件运算符 ? 和 : 是一对运算符,不能分开单独使用。

c)条件运算符的结合方向是自右至左,例如:a>b?a:c>d?c:d 应该理解为 a>b?a:(c>d?c:d) 这也是条件表达式嵌套的情形。

5. switch语句:

switch(表达式) {

case 常量表达式1:语句1;

case 常量表达式2:语句2;

...

case 常量表达式n:语句n;

default:语句n+1;

}

在 switch语句 中,每个"case 常量表达式"只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面的case语句的情况。

这是与前面介绍的if语句完全不同的,应特别注意。

为了避免上述情况,C语言提供了一种break语句,专门用于跳出switch语句。

在使用switch语句时应注意以下几点:

a)在case后的各常量表达式不能相同,否则出现出错。

b)在case之后,允许有多个语句,可以不用{}括起来。

c)各case和default字句的先后顺序可以变动,而不会影响程序执行结果。

d)default字句可以省略不用。

六、循环控制

1)用goto语句和if语句构成循环

2)while语句

3)do-while

4)for

1. goto语句以及用goto语句构成 循环

使用方法:goto 语句标号;

标号是一个有效的标识符,这个标识符加上一个":"一起出现在函数内某处。

另外,标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。

一般不要使用goto语句,但在多层嵌套退出时,使用goto语句比较合理。

例子:

loop: if (i<100) {

sum+=i;

i++;

goto loop;}

2. while语句

形式: while(表达式) 语句;

使用while时应注意:只要表达式的值为非0,即为真,就一直循环。如:

int a=0,n;

printf("\n input n: ");

scanf("%d",&n);

while (n--)

printf("%d ",a++*2);

3. do-while语句形式:

do

语句

while(表达式);

同样,如果有多条语句,需要使用{}括起来。

4. for语句形式:

for(表达式1;表达式2;表达式3)

语句;

执行过程如下:

1)先求解表达式1

2)再求解表达式2,如果为真,则执行循环体内的语句,否则跳过循环,即跳到第5步

3)执行完循环体内的语句后,求解表达式3

4)回到第2步

5)循环结束

和while对应的就是:

表达式1;

while(表达式2)

{ 语句;

表达式3;

}

使用for注意的是:

1)for循环中的“表达式1”,“表达式2”,“表达式3”都是可选的,即可以缺省,但是;不能缺

2)省略了“表达式1”表示不对循环控制变量赋初值

3)省略了“表达式2”表示死循环

4)省略了“表达式3”则不对循环控制变量进行操作,这时可以在语句体中加入修改循环控制变量的语句。例如:

for (i=1;i<=100;)

{sum+=i;

i++;}

5)省略了“表达式1”和“表达式3”。例如:

for (;i<=100;)

{sum+=i;

i++;}

3个表达式都省略:

for(;;) 语句;

等价于

while(1) 语句;

5. 几种循环的比较:

1)一般不提倡使用goto语句。

2)while和do-while的循环体中应包括使循环趋于结束的语句。for语句功能最强。

3)用while和do-while循环时,循环变量初始化的操作应在之前完成,而for语句可以在表达式1中实现循环变量的初始化

6. break和continue语句:

(1)break:

a)通常break语句总是与if语句联在一起,即满足条件时便跳出循环。

b)break语句对if-else的条件语句不起作用

c)在多层循环中,一个break只向外跳一层。

(2)continue语句

也是通常与if语句一起使用,用来加速循环

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值