""概述:C语言总共分为9个模块""
1.顺序程序设计训练
2.分支程序设计训练
3.循坏程序设计训练
4.数组应用训练
5.模块化程序设计训练
6.构造数据类型应用训练
7.指针应用训练
8.文件操作训练
9.位操作训练
(#注意:若是甘肃专升本小伙伴只需学到第六章构造数据类型应用训练)
今天,小编先带大家认识模块一:顺序程序设计训练
先引用一个程序:
#include<stdio.h> void main(){ printf("Hello World!") /* 输出语句 "Hello World! "*/ }
这是完整的一个c语言程序 “/* “与” */”及其之间的内容是对程序的注释说明,对程序运行没有任何影响。
main()是主函数,“{"与"}”之间的语句是main()函数的内容,是程序的主体,也称函数体。所有的c语言程序都必须包含有一个main函数。程序从main()函数的第一行语句开始执行,到最后一条语句结束。
printf()函数式C语言标准输出的函数
“\n”是换行控制符,表示该符号之前的内容输出完毕后换行显示
0.1C语言程序概述
eg0-1:键盘输入两个数,比较大小,并输出两个数中的最大值
#include<stdio.h> int max(int x,int y); void main(){ int a,b,m; scanf("%d%d",&a,&b); m=max(a,b); printf("a=%d,b=%d,m=%d",a,b,m); } int max(int x,int y){ int m; if(x>y) m=x; else m=y; return m; }
C语言程序特点:
1.每条语句后面都已 “;”作为终止符,他是C语句结束符。
2.每个程序必须有一个且只能有一个主函数,程序从主函数开始执行你。一个程序可以包含多个源程序文件,每个源程序文件又可以包含多个用户自定义函数。函数之间是相互独立、相互平行。源程序最基本组成单位是函数。
3.在C语言中,大小写字母是有区别的。
4.程序中可以加注释,注释可分为块注释和行注释两种。“/* ...... */”
为块注释,可注释多行。“//”行注释,只注释一行。
C语言函数分两类:系统本身提供的库函数和用户自定义函数
C语言的书写格式
-
程序中每行可写一条语句,也可写多条语句,一般一行写一条语句
-
程序的书写要注意适当缩进,使程序清晰易读
-
程序中的花括号必须成对出现
-
写程序时,要习惯使用注释
0.1.1程序构成
注:其中f1~fn代表用户自定义函数
编译预处理行
全局变量说明
void main(){
局部变量说明
程序段
}
返回数据类型f1(形式参数说明){
局部变量说明
程序段
}
返回数据类型f2(形式参数说明){
局部变量说明
程序段
}
......
返回数据类型fn(形式参数说明){
局部变量说明
程序段
}
说明:
(1)C语言的变量在使用之前必须先定义其数据类型,未经定义的变量不能使用,且定义变量的语句必须放在可执行语句前面;
(2)程序段通常由多条语句组成;
(3)形式参数说明用于传值,参见后面的函数调用部分内容;
(4)局部变量、全局变量的用法含义,参见模块五的内容;
(5)花括号内的内容统称为函数体;
(6)用户定义的函数名由用户命名(命名应符合标识符的命名规则);
(7)用户自定义函数可置于主函数之前,也可置于主函数之后。若用户自定义函数 在主函数之后,且要在主函数中调用时,要在主函数之前对被调用函数进行函数声明。
0.1.2特殊字符
1.关键字
关键字是C语言编译程序本身所使用的专用词,具有特定的含义,例如int用来定义整数类型。关键字一般都是用小写字母来表示的。C语言的关键字有: auto、break.long、register、 return、short、 signed、 sizeof、 static、 struct、 switch、 typedef、 union、 unsigned. void、volatile、while。
2.标识符
C语言中,变量、函数都需要有一-个名称,即标识符。[0- 1]中的max就是标识符。用户自定义的标识符要符合C语言标识符的命名规则。
C语言标识符命名规则
(1)标识符由字母(AZ,az)、下划线(. )或数字(0~9)组成。
(2)标识符必须以字母(AZ,az)或下划线(_ )开头。
(3) C语言中标识符严格区分字母大小写。例如aB12、Ab12、AB12、ab12是不同的标识符。
(4)标识符不能使用C语言的关键字。例如char、do.for.if、int等。
例如:
这些是合法的标识符: A123、a 23、123、a_ b。
这些是不合法的标识符: 5abc 、aa - bb、a&b. M. H. Thatcher.a#、ab$。
标识符的长度不要太长,建议在8个字符以内。
定义标识符时尽量做到“见名知意”。如:name表示姓名,age表示年龄,或汉语拼音的首字母xm表示姓名,nl表示年龄。
3.分隔符
分隔符用来使编译器确认代码在何处分隔,C语言中分隔符包括注释符、空白符及普通分隔符。
(1)注释符。
(2)空白符。空白符包括空格、回车、换行和制表符(Tab键),用来分隔程序的各基本成分。一个或多个空白符的作用完全一样。
(3)普通分隔符。普通分隔符的作用也是用来分隔程序的各成分,在程序中有特定
的含义,不能省略。普通分隔符见表0- 1。
表0-1C语言的普通分隔符
普通分隔符 | 名称 | 用途 |
---|---|---|
{} | 大括号/花括号 | 定义复合语句、函数体及数组的初始化 |
[] | 方括号 | 定义数组类型及引用数组元素 |
() | 小括号 | 区分函数名及其参数,表达式中限定运算顺序 |
; | 分号 | 语句结束标志 |
: | 冒号 | 标号 |
. | 圆点 | 区分复合类型变量与其成员变量 |
, | 逗号 | 构成逗号表达式 |
? | 问号 | 构成问号表达式 |
0.2C语言程序开发过程
编辑 编译 连接 执行
源程序 .C文件
目标程序.obj文件
可执行文件.exe文件
1.编辑程序
用户将C语言的源程序输人计算机,以文本文件的形式存放在磁盘上。其文件标识为:“文件名.c”。其中,“文件名”是用户指定的、符合操作系统规定的任意字符组合,扩展名是“.c”,表示该文件是C语言程序。
2.编译程序
编译是把C语言源程序翻译成用二进制指令表示的目标程序。编译过程由C编译系统提供的编译程序完成。目标程序的文件标识是:“文件名. obj"。
3.程序连接
用系统提供的连接程序将目标程序、库函数或其他目标程序连接装配成可执行的程序。可执行程序的文件标识为:“文件名. exe"。
4.运行程序
将可执行程序投人运行,以获取编程处理的结果。与编译、连接不同的是,运行程序可以脱离语言编译环境。
对于不同的C语言上机环境,编译系统支持性能各异,上述步骤有些可以再分解,有些也可以集成进行批处理,但逻辑上是基本相同的。
0.3基本数据类型
0.3.1整型数据
1.整型常量
C语言中的整型常量有三种表示形式:
(1)十进制整数。例如2、- 983。
(2)八进制整数。八进制整数以0开头,由0~7构成。例如012表示八进制整数12,即(12)8。
(3)十六进制整数。十六进制整数以0x开头,由09和AF或a~f构成。例如0x12A,表示十六进制整数12A,即(12A)16。
整型常量不必使用强制类型说明就可以直接使用,当遇到整型常量时,编译器会自动
根据其值将该常量认定为相应的类型,保证其按适当的类型参与运算。
一个整型常量,其值在一32 768~ 32 767之间时,默认是int型,可以把它赋值给int 型、short型或long型变量;而在- 2147 483 648~2 147 483 647范围之间时,则默认是长整型,可以把它赋值给long型变量。
一个整型常量后有U或u后缀时,被认为是unsigned类型,在内存中按unsigned规定的方式存放;而一个整型常量有加l或L后缀时,则被认为是long类型,在内存中按long规定的位数存放。
2.整型变量
在C语言中,整型类型标识符为int。根据整型变量的取值范围又可以将整型变量定义为以下6种整型类型:
有符号基本整型 | [signed] int |
---|---|
无符号基本整型 | unsigned [int] |
有符号短整型 | [ signed] short [int] |
无符号短整型 | unsigned short [int] |
有符号长整型 | [signed] long [int ] |
无符号长整型 | unsigned long [int] |
在存储有符号数时,存储单元的最高位代表符号位,0为正,1为负。而存储无符号数时,存储单元全部用作存放数本身,一个无符号整型变量只能存放不带符号的整数。
在定义变量时,方括号内的部分是可以省略不写的,一般省略方括号中的标识符,如:
short data;
uns igned data2 = 9887;
0.3.2实型数据
实行数据又称为浮点型数据,实数类型也交浮点类型,实型数据在内存中按指数形式存储
eg:0-2编一个程序,给定三角形的边长,计算三角形的面积
#include"math.h" #include <stdio.h> void mian(){ float a=3.0f,b=4.0f,c=5.0f,s,area; //定义实型数据类型变量 s=1.0f/2.0f*(a+b+c); area=(float)(sqrt(s*(s-a)*(s-b)*(s-c))); printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s); printf("area=%7.2f\n",area); //以实数型类对实型变量输出数据 }
在C语言中,实型变量分为单精度实型(float) 、双精度和长双精度实型(long double)
(2)实型常量。实型常量有两种表示形式:
①十进制小数形式:由数字和小数点组成。如:“. 67”、“5.2”、“9.”等都是合法的十进制小数形式。
②指数形式:由尾数、e(或E)以及指数三个部分组成。
字母e(或E)之前必须有数字,并且小数点左边有且只有一位非零数字,指数部分则必须为整数。 例如,1.e1代表1.0X10' ,9. 8E0代表9.8X10 0 ,8.997e- 12代表8.997X10 -12 ,-5.43E4代表-5.43X104,这些都是合法的指数形式的实型数据;而5.4E..E、e-6、3e3.1则都是不合法的指数形式的实型数据。
KEN=k*10 n
0.3.3 字符型数据
字符数据是计算机信息处理的重要组成部分,通常以ASCII码形式 输入和输出
eg:0-3编程实现字符的输出
#inlude<stdio.h> void main(){ printf("%c\n",'\a'); printf("%c\n",'\141'); printf("%c",98); }
1.字符型常量
字符型常量是用单引号引起来的-一个字符,如' A','x','%'等。另外还有一种特殊的字符常量称为转义字符,是以一个反斜杠“\”开头的字符序列。C语言规定:以反斜杠开头,后跟-一个字母代表- - 个控制字符;“\”后跟13位八进制数字,代表ASCII码为该八进制数的字符;在“\x”后跟12位十六进制数字,代表ASCII码为该十六进制数的字符。
如果要输出ASCII码值在0x00~0xFF之间的字符,可以用反斜杠和特定字符组合表示。
C语言中的转义字符如表0-3所示
字符形式 | ASCII码 | 功能 |
---|---|---|
\0 | 0x00 | NULL |
\a | 0x07 | 响铃 |
\b | 0x08 | 退格 |
\t | 0x09 | 水平制表(Tab) |
\f | 0x0c | 走纸换页 |
字符形式 | ASCII码 | 功能 |
---|---|---|
\n | 0x0a | 回车换行 |
\v | 0x0b | 垂直制表 |
\r | 0x0d | 回车不换行 |
\ \ | 0x5c | 反斜杠 |
\' | 0x27 | 单引号 |
\" | 0x22 | 双引号 |
\? | 0x3f | 问号 |
\ddd | 0ddd | 1~3位八进制数所代表的字符 |
\xhh | 0xhh | 1~2位十六进制数所代表的字符 |
利用上述转义字符“\ddd”和“\xhh" ,可以输出各种字符。
由于字符型数据在内存中是以字符的ASCII码值形式来存放的,所以字符型数据和整型数据是可以互相通用,并可进行算术运算的。一个字符型数据既可以以字符形式输出,也可以以整数形式(ASCII码值)输出。当字符型数据参加算术运算时,实际上是用其
ASCII码值参加运算的。
eg:0-4 编程检验 ASCII码值与字符的对应关系。
#include<stdio.h> void mian(){ char c1,c2; c1=97;c2=98; printf("%c,%c\n",c1,c2); print("%d,%d\n",c1,c2); }
2.字符型变量
字符型类型标识符为char,一个字符型变量的值只能是-一个单字符。不同的编译系数据可以分为有符号字符型( [signed] char) 和无符号字符型(unsigned char)两类。
字符型变量的定义形式为:[signed] char的取值范围是- 128~ 127 ,而unsigned char的取值范围是0~255。
char变量名表;
例如:
char char1, char2='&';
3.字符串常量
字符串常量是由一对双引号引起来的一一个字符序列。例如:"How are you!"是-个字符串常量。在程序中,不能把一个字符串常量赋给一个 字符型变量,例如下面的语句是非法的。
char char1="y"; /错/
字符串常量和字符常量在存储单元中有不同的存储形式。注意:'a'与"a"表示的含义是不同的,a'表示一个字符常量,"a"表示一个字符串常量。它们的存储形式是不同的,a'占一个字节,而"a"要占两个字节,在存储"a"时,系统会在字符串的结尾加上一个字符串结束标志\0'(ASCII码为0)。如下图0 - 3所示。
字符常量‘a’
01100001
字符串常量"a"
0110000100000000
在C语言中没有字符串这种数据类型。因此没有专门的字符串变量来存放字符串常量,只能使用字符数组来存放一- 个字符串。
0.3.4数据类 型转换
在C语言中,字符型数据与整型数据可以通用,整型、单精度型和双精度型数据也可以混合运算。运算时,一个表达式中不同的数据类型首先要转换成同一种类型,再进行运算。当然,数据类型转换需要遵循一定的规则。
(1)当运算对象数据类型不相同时,字节短的数据类型自动转换成字节长的数据类型。char字符型数据转换成int整数,shortint型数据转换成int型,float型数据转换成double型。
(2)当运算对象类型不同时,如果int型与unsigned型进行运算,就将int型转换成unsigned型,运算结果为unsigned型;如果int与double型进行运算,就将int 型直接转换成double型,运算结果为double型;如果int型与long型进行运算,就将int型转换成long型,运算结果为long型。这些转换图0-4数据类型转换图都是系统自动完成的。
3.类型转换也可强制进行
int a = 4555
char b;
b = (char)a;
eg:0-5 试分析下面程在进行混合运算时的数据转换过程
#include<stdio.h> void mian(){ char a='x'; int b=3,f=2; float c=2.5678f; double d=5.2345; long e=32L; printf("%f\n",a-b+d/c-e*f); }
0.4运算符和运算表达式
程序设计中用来表示各种运算的符号称为运算符,参与运算的数据称为运算对象,或称为运算量、操作数。运算符用于控制运算对象,用运算符将运算对象连接起来的式子称为运算表达式。运算表达式的种类有很多,如算术表达式、逻辑表达式、关系表达式等。
在C语言中,除了控制语句和输入输出之外,几乎所有的基本操作都被当作运算来处理。
在C语言中,运算符包括:单目运算符(如负号运算符,地址运算符&),只允许有一个运算对象;双目运算符,运算时有两个运算对象参加运算(如: +,-, * ,/);三目运算符(条件运算符)。
一个运算表达式中有多个运算符时,表达式中运算符被处理的先后次序称为运算符的优先级。当一个运算对象两侧的运算符的优先级相同时.则按照C语言规定的结合方向先后来进行计算,这就是运算符的结合性6单目运算符的优先级高于双目运算符
这里主要介绍算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符和逗号运算符,以及相应的运算表达式。其他运算符及其表达式将在以后的学习内容中介绍。
0.4.1算术运 算符和算术表达式
算术运算符包括基本算术运算符(+,- ,* ,/,%)和自增运算符(++)、自减运算符(-- )两类。基本算术运算符中除了取正负值运算符+ (取正值)和- (取负值)外,其他都是双目运算符。取正负值运算符以及自增运算符、自减运算符都只对一个操作数进行运算,因此都是单目运算符。
C语言中提供的算术运算符如表0-4所示。用算术运算符和括号将运算对象连接起来的符合C语言语法规则的式子称为算术表
1.基本算术运算符
加法运算符 、正值运算符。例如表达式“x+y”表示求x与y的和,“+y”表示取y的正值。
减法运算符、负值运算符。如表达式“x-y” 表示求x与y的差,“-y”表示取y的负值。
乘法运算符。如表达式“x*y”表示求x与y的积。
除法运算符。如表达式“x/y”表示求x 与y的商。在除法运算中,两个整型数据相除的结果仍然是整型数据,不能被整除时结果中的小数部分被舍去。当除数和被除数中有一个负整数时,其结果随机器而定,多数机器采取“向零取整”的原则,即向零靠近取整。如“8/5”"的结果为1,“8/( - 5)”的结果为- 1。
%模运算符(求余运算符)。 如表达式“x%y”表示求x除以y的余数。在模运算(求余运算)中,%两侧的运算量必须都是整型,其结果是两数相除所得的余数。在多数机器上,所得的余数与被除数符号相同。如“8%( - 5)”的结果为3,而“( - 8)%5”的结果为-3。
如果参加运算(+.-.*./)的两个数中有--个是实型数据,其结果将是double型数据。
2.自增、自减运算符
自增、自减运算符用来对一个操作数进行加1或减1运算,其结果仍然赋值给该操作数,而且参加运算的操作数必须是变量,而不能是常量或表达式。
自增运算符:如“x++"表示在使用x之后,使x的值加1,即“x=x+1”。
“++x"表示在使用x之前, 先使x的值加1,即“x=x+1”。
自减运算符:如“x--”表示在使用x之后,使X的值减1,即“x=x-1”。
“--x”X '表示在使用x之前,先使X的值减I,即“x
“++x”和“--x”都把运算符用在了操作数之前,称为前缀运算;前缀运算是变量首先加1或减1,然后再使用变量的值。“x++ ”和“x--”,则为后缀运算。而后缀运算则是使用变量的值后,再执行变量加1或减1。
eg0-6:变量自加运算
#incude<stdio.h> void mian(){ int x,y,z1,z2; x=7; y=8; z1=y-(x++); z2=y-(++x); printf("x=%d\ty=%d\ny-(x++)=%d\ny-(++x)=%d",x,y,z1,z2); }
3.算术表达式
算术表达式中运算对象可以是常量、变量或函数等。例如,“a%5/2 -(b+ 2)"就是一个合法的算术表达式。
C语言规定了运算符的优先级和结合性(见附录D),在算术表达式求值时,按照优先级别的高低和结合方向来依次运算。例如在计算表达式“a-bc”时,b的左侧为减号,右侧为乘号,而乘号优先于减号,因此,相当于“a-(bc)”。如果在一个运算对象两侧的运算符的优先级别相同,例如“a- b+ c”,则按规定的结合方向处理。
C语言中表达式要按照规定的语法来写。例如,一个表达式应该写在- -行,表达式中不允许使用方括号和花括号,表达式中也不允许省略运算符等。
0.4.2赋值运算符 和赋值表达式
赋值运算符有基本赋值运算符(= )以及复合赋值运算符,也称扩展赋值运算符(*=, +=等)两类。赋值运算符“二”,可将一个表达式或数据的值赋值给一个变量。由赋值运算符将一个变量与- - 个表达式连接起来的式子称为赋值表达式。
1.基本赋值运算符
赋值的含义是将赋值运算符右边表达式的值,存人左边以变量名为标识的存储单元中。例如“x= 5”的作用是将常量5存放到以x为标识的存储单元中。
2.复合赋值运算符
为了使程序简练并提高编译效率,C语言允许将双目运算符加在“=”的前面构成复合赋值运算符。其形式为:
<双目运算符>=
例如:“x+=3"等价于“x=x+3”。复合赋值运算符总共有十种: +=、-=、*=、/=、%=.>>=、<<=、&=、^=、|=。
前五种是算术复合赋值运算符;后五种是位复合赋值运算符,在后面的学习内容中将介绍。
3.赋值表达式
赋值表达式的一般形式为:
<变量> <赋值运算符><表达式>
其中,表达式可以是常量.变量.函数或由它们组成的表达式,也可以是赋值表达式,赋值表达式的值为赋值号右边表达式的值。
在进行赋值运算时,如果赋值运算符两边的数据类型不同,系统将会自动进行类型转换,即将赋值运算符右边的数据类型转换成左边的变量类型。当左边是整型而右边是实型时,将去掉小数部分并截取该整型对应的有效位数。当左边是单精度而右边是双精度实型时,系统将进行四舍五人处理并截取相应的有效位数。
当赋值运算符是复合赋值运算符时,赋值表达式等价于
<变量>=<变量><双目运算符><表达式>
即将变量的当前值取出,与表达式进行由双目运算符确定的运算,最后将所得的结果再赋值给该变量。例如,“y/=x+9”实际 上等价于“y=y/(x+9)”。注意:将复合赋值运算符右侧的表达式看成一个整体。
当赋值运算符右边的表达式为赋值表达式时,根据赋值运算符的结合性来处理运算,赋值运算符的结合方向为右结合。
例如:设a的初值为5,对表达式“y=a *=6+(a+= 1)”进行求值。在求值时,首先计算“(a+= 1)”,得到“a=6" ;再进行“a =6+6"的运算,相当于“a=a(6+6)”,得到a的值为“6* (6+6)= 72”;最后再执行“y=a”运算,得到y的值为72。
0.4.3关系运算符和关系表达式
关系运算是对两个运算对象进行大小比较的运算。C语言中的关系运算符及其优先级别如表0- 5所示。关系运算符的优先级低于算术运算符,高于赋值运算符。
关系表达式是用关系运算符将两个表达式连接起来的式子,称为关系表达式。关系表达式的一般形式为:
<表达式><关系运算符><表达式>
其中,表达式可以是算术表达式,逻辑表达式,赋值表达式或字符表达式,也可以是关系表达式。
关系表达式的值非真即假。当关系表达式成立时,关系表达式的值为1(真);当关系表达式不成立时,其值为0(假)。例如,“a=(b>= 3)”在运算时,根据优先级别首先做关系运算“b>3",如果6等于5,则"5> 3”的结果为1;然后再进行赋值运算,得到结果a等于1。
0.4.4逻辑运算符和逻辑表达式
C语言有三种逻辑运算符,分别是逻辑与(&&)、逻辑或(|)、逻辑非(!),逻辑运算符
逻辑运算符“!”是单目运算符,而“&&”和“I"是双目运算符。
逻辑运算符比关系运算符优先级低,比赋值运算符优先级高。
用逻辑运算符将运算对象连接起来的式子称为逻辑表达式。例如: a>b&&c>d。
关系表达式和逻辑表达式主要在判断是否满足指定条件时使用。和关系表达式一样,逻辑表达式的值只有“真”和“假”,当逻辑关系成立时,逻辑表达式的值为1(真),当逻辑关系不成立时,逻辑表达式的值为0(假)。当a、b的值为不同的组合时,逻辑运算“!a”、“a&& b”和“a I b”的真值情况如表0-7所示。
C语言规定,当运算对象为0时,即判定其为假,当运算对象为非0的任何值(包括负值),即判定其为真。例如: a=2,b=0,则“!a”等于0,“!b”等于1,“a&&b”等于0,“a|| b”等于1。
C语言在逻辑表达式求解时,不- -定要执行完逻辑表达式中所有的逻辑运算符,只要能判断出表达式的值,就不再执行下去。例如:
对于表达式“a&&b&&c",只要有一个运算对象为假,则结果为假,因此当a为假时,则可得出该表达式的值为假,不需要判断b和c的值;只有当a为真时,才需要判断b;只有a和b都为真时,才需要判断C。
对于表达式“a |I b lI c”,只要有一个表达式的值为真,其结果就为真,因此当a的值为真时,可得出表达式的值为真,程序不再对b.c进行判断;只有a的值为假,才需判断b;只有当a、b都为假时,才需进- - 步判断c的值。
0.4.5逗号运算符和逗号表达式
“,”为逗号运算符,又称为顺序求值运算符。用逗号运算符可以将若干个表达式连接起来构成一一个逗号表达式。逗号表达式的一般形式为:
表达式1,表达式2,.,,表达式n
逗号运算符在所有的运算符中的优先级别最低,其结合性为左结合性,即从左到右顺序求值。先求解表达式1,再求解表达式2,..,最后求解表达式n,而表达式n的值即为整个逗号表达式的值。
用逗号运算符连接的表达式也可以是赋值表达式。例如“a=2*3,a =4,a-6"。在处理时首先按照优先级别和结合性首先计算“a=2 3”,得到“a=6",再处理“a =4",即“a=a4" ,将“a=6"代人,得到“a=24”,最后再将a值代入“a-6”,得到18。此逗号表达式的最终结果为18,而a的值为24。
另外,并不是在任何地方出现的逗号都是作为逗号运算符,多数情况下逗号只作为分隔符使用,比如函数参数之间、定义变量时各个变量名之间都是用逗号作为分隔符的。
0.4.6条件运算符和条件表达式
C语言中的条件运算符由问号(?)和冒号(:)组成。它是C语言中唯-一的一个三目运算符。要求3个运算对象同时参加运算。由条件运算符构成的条件表达式的一般形式如下:
表达式1 ?表达式2:表达式3
运算规则:如果表达式1为“真”,则求解表达式2的值,并将其作为整个条件表达式的值;否则就求解表达式3的值,并将其作为整个条件表达式的值。例如:,
sum= (a>=b+ 3)? 5:a;
当a=3、b=5时,sum=3;而当a=3、b=0时,sum= 5。
(1)条件运算符仅比赋值运算符优先级高,低于逻辑运算符、关系运算符和算术运算符。
例如,“x=ab !=0? a+ 1:b/2”相当于“x=(ab !=0)? (a+ 1):(b/2)”。首先
计算“a * b" ,并与0比较,如果其值不等于0,即表达式“a*b!=0”为真,则计算“a+ 1”,并将所得结果赋值给x;否则计算“b/2" ,并将所得结果赋值给x。
(2)条件运算符的结合方向为右结合。
例如:“x=ab !=0? a+1:b>2? 3:b/2"相当于“x=(ab !=0)? (a+ 1):((b>
2)? 3:(b/2))”, 按照先右后左的顺序,首先计算右边的条件表达式“b>2? 3:b/2”,然后代人求得的值,再求解左边的条件表达式。
(3) C语言会将条件表达式的值的数据类型自动转换为表达式2和表达式3中较高级的数据类型,原则上表达式2和表达式3的值的数据类型相同。例如: x= (a>b)? 'a':1.2
如果a小于等于b,则将条件表达式的值1.2赋给x;如果a大于b,则将条件表达式的值a'的ASCII码(即97)赋给x,但由于1.2是实型,因此结果97将被转换为实型后再赋给x。
这几种运算符的优先级关系从高到低次序,如表0- 8所示。
小墨在这里