60
第 2 第第第第第 第第第第第第第 本本本本本本2.1 本本本本本本本本 2.2 本本本本本本 2.3 本本本本本 2.4 本本本本本 2.5 本本本 2.6 本本本

第 2 章 数据类型、运算符和表达式

  • Upload
    milica

  • View
    166

  • Download
    0

Embed Size (px)

DESCRIPTION

第 2 章 数据类型、运算符和表达式. 本章主要内容: 2.1 基本符号和标识符 2.2 基本数据类型 2.3 常量与变量 2.4 数据的输出 2.5 运算符 2.6 表达式. 2.1 基本符号和标识符. 如同自然语言一样,程序设计语言也有基本符号,再由基本符号按一定的构词规则构成基本词汇,最后按语言的句法由基本词汇组成源程序。 C 语言的基本符号和标识符如下。. 2.1.1 基本符号. 基本符号即字符集,是高级语言的编译系统所能识别的字母、数字和特殊符号。每种高级语言都有自己特定的基本符号。 C 语言的基本符号由一下七类: 数字: 0~9 十个数字。 - PowerPoint PPT Presentation

Citation preview

第 2章数据类型、运算符和表达式

本章主要内容:2.1  基本符号和标识符2.2 基本数据类型2.3 常量与变量2.4 数据的输出2.5 运算符2.6 表达式

2.1 基本符号和标识符 如同自然语言一样,程序设计语言也有基本

符号,再由基本符号按一定的构词规则构成基本词汇,最后按语言的句法由基本词汇组成源程序。 C 语言的基本符号和标识符如下。

2.1.1 基本符号 基本符号即字符集,是高级语言的编译系统所能识

别的字母、数字和特殊符号。每种高级语言都有自己特定的基本符号。 C 语言的基本符号由一下七类:

数字: 0~9 十个数字。英文字母:大写字母 26个( A~Z);小写字母 26个( a~z)

括号:(), [ ] ,{} 运算符: + - * / = > < % & | ? ! ^ ~ 标点符号:’ ” : ;

2.1.1 基本符号 特殊符号: \ _ $ # 空白符:空格符、换行符、制表符 基本符号中的字符按照 C 语言的语法规则组

合起来,就能通过编译系统的语法和词法分析。不在基本符号中的字符可以用双引号括起来,形成字符串后出现在语句中。例如“、”,“ @” 等。

2.1.2 标识符 标识符是用来命名变量、常量、类型、函数、

语句等程序对象的,是一个字符序列。在 C语言程序中,一个合理的标识符由英文字母或下划线开头,后接零个或任意个字母、下划线,其长度不超过 8 个。

C 语言的标识符分三类:关键字、特定字、用户定义字

2.1.2 标识符 1 关键字(也称保留字) 关键字是一些英文单词,一般用小写字母表示。 C 语言利用

单词的意义标识 C 程序结构。关键字是 C 编译程序预先登录的标识符,它们代表固定的含义,用户不能随便用来标识程序对象。

下面是 C 语言的大部分关键字: autu break case char const continue default do double else enum extern float for goto if int long register return short signed static struct switch typedef union unsigned void volatile while

2.1.2 标识符 2 特定字 特定字是具有特殊含义的标识符,它们虽然不是 C

语言的关键字,但是习惯上把它们看成关键字,建议不要再程序中随便使用。下面几个特定字通常在C 程序中的预处理命令行中使用。

define undef include ifdef ifndef endif line elif

2.1.2 标识符 3 用户定义字 用户定义字是程序员在程序设计时为变量、常量、函数等程序对

象其起的名字。为了便于联想和记忆,建议用户给程序对象命名时,使用能反映该对象意义的定义字。通常要注意一下几点:

( 1 )不能使用关键字和特定字。 ( 2 )为了区别不同的程序对象,用户定义字的前 8 个字符不能相同。

( 3 )最好使用英文和汉语拼音缩写,以便阅读和检查。 ( 4 ) C 语言区别大小写,大、小写代表不同的意义。如 TEXT

和 text 代表不同的标识符。 ( 5 )避免使用容易混淆的字符。如 1 与 I, 0 与 o , 2 与 z 等。 ( 6) C语言由许多库函数,用户定义字不能与库函数同名。

2.2 数据类型数据类型在高级语言中是一个很重要的概念。 C语

“ ”言数据的使用严格遵照 先说明类型后使用 的原则。因为不同类型的数据在内存的存储方式不同,所占的字节数也不同。高级语言能表示的数据类型越多,程序编写起来就越方便。

2.2.1 C 语言数据类型

2.2.1 C 语言数据类型 基本数据类型是 C 内部定义的,基本类型也是构造其他类型的基础。

复杂数据类型是用户根据程序需要并按语法规则构造出来的数据类型。

指针在 C 语言中使用极为普遍,指针提供了动态处理变量的能力,是 C 语言的精髓。

2.2.2 基本数据类型 短整型 short int( 1 )整型 长整型 long int 普通整型 int

普通浮点型 float( 2 )浮点型 双精度浮点型 double ( 3 )字符型 char 不同的数据类型在计算机内存中所占存储空

间大小不同。一般情况,长整型是短整型的二倍,双精度浮点型是普通浮点型的二倍,一个字符占 8位。基本数据类型的存储方式和取值范围,如表 2-1 所示。

2.3 常量与变量数据在程序中需要一定的表达方式,常量和变量就是用来表示数据的。

2.3.1 常量 常量是指取值在程序的执行过程中始终保持不变的

量。根据取值和表示方法的不同,常量有如下类型: 1. 整型常量 整型常量的表示通常有三种:十进制表示、八进制

表示、十六进制表示。十进制表示不能以 0开头;八进制表示以数字 0开头;十六进制以数字 0和 x 开头。

2.3.1常量【例 2.1】整型常量举例。 Int x,y,z X=10; Y=010; Z=0x10;执行上述程序后,变量 x中的数据值是十进制数 10;变量 y中的数据值是十进制数 8;变量 z中的数据值是十进制数 16 。

2.3.1常量 2. 浮点型常量 在数学上,表示小数由两种方式:一种是小数表示

法,另一种是科学计数法,也称指数表示法。浮点数表示法来源于数学中的指数表示形式,如 193.5可以表示为 0.1935103 或 1.935102 等。

浮点数在存储时,同样大小的空间,可以存放远比整型常量数取值范围大得多的值。

2.3.1常量 C 程序中的浮点常数由整数部分、小数部分和指数部分构成。 其中,整数部分和小数部分用小数点连接;小数部分和指数

部分用 e 或 E 连接。 浮点常量的构成规则是: ( 1 )整数部分和小数部分可以不写,但不能同时不写。 ( 2 )指数部分可以省略,省略时相当于小数表示法。 ( 3 )若有指数部分, e(或 E) 两边至少有一位数。 ( 4)指数的数字必须是整数( 1~ 3位),可以有正负号,正号可省略。

2.3.1常量【例 2.2】浮点型常量举例。 Float x,y,z X=4.50e3 Y=1.235e-3 Z=1.058执行上述程序后,变量 x中的数据值是十进制数 45

00;变量 y中的数据值是十进制数 0.001235;变量 z中的数据值是十进制数 1.058。

2.3.1常量 3. 字符型常量 在 C 语言中的字符常量是用单引号括起来的一个字符。 字符常量的构成规则是: ( 1 )单引号中的字符只能有一个。 ( 2 )字符仅能用单引号,不能使用双引号定义字符常量。 ( 3 )非图形字符也可以表示成字符常量,如退格、换行。

表示方法是使用转义符 \ 与一些特殊字符构成转义序列。例如’ \n’ 表示“回车换行”。

常见的转义字符如表 2-2 所示。

2.3.1常量

2.3.1常量 4. 字符串常量在 C中用双引号引起来的若干个字符称为字符串常

“量。例如: welcome”, “198.75” 。字符串常量在内存中是按顺序逐个存储的,存储的是字符串的 ASCII “码,并在最后一个存储单元存放一个 \0”

“字符,表示串结束。字符串的长度是指串中 \0”字符之前的所有字符数量,包括不可见字符。因此字符串常量实际占用的字节数是:串长+ 1。

2.3.1 常量 例如:“ welcome”实际上占用的内存字节数是 8,而不是 7,如图 2-3 所示。

图 2-3 字符串常量存储示意图 字符串的输出有两种方法:直接输出: printf(“welcome”);转换输出: printf(“% s” ,“ welcome”);

w e l c o m e \0

2.3.1常量 5. 指针常量任何类型的指针都可以赋以 0值( NULL) ,称为空指针,表示当前该指针不指向任何类型的任何变量,而不是指向地址为 0的存储单元。因此, NULL是一个指针常量。

2.3.2 变量 变量是指取值在程序的执行过程中取值可以改变的量。 在使用一个变量之前,程序员必须为每个变量起一个名字,并定义它的数据类型。也就是说,变量必须用标识符进行标识,该标识符称为变量名。

给变量定义标识符,目的是在程序编译时,编译器根据变量类型为每个变量分配一段连续的存储单元,用于存储该变量的取值。

变量名和内存单元地址之间存在一个映射关系。当程序引用变量时,计算机会通过变量名寻址,从而访问到其中的数据。

2.3.2 变量 在 C 语言中,所有的变量都必须先定义后使用。它的意义在于明确了变量的 4 个属性:变量的名字、数据类型、允许的取值范围以及合法的操作。这样编译系统就会完成如下工作。

( 1 )编译系统会根据定义为变量预先分配内存空间; ( 2 )未经定义的标识符,系统不允许作为变量名使用; ( 3 )便于在编译期间进行语法检查。不同类型的变量有其相应的合法操作,编译系统会根据变量的类型对其操作的合法性进行检查。

2.3.2 变量 1. 定义变量的格式 类型说明符 变量名表 ; 说明:类型说明符 指定了变量的数据类型,可以是 int 、 fl

oat 、 double 、 char 等。 变量名 要符合用户定义字的命名规则,一般使用小写字母。 变量名表 一种类型有多个变量时,变量名之间用逗号“,”

分隔。类型说明语句用分号结束。 【例 2.4】定义 2 个整型变量, 1 个字符型变量。 int i,j; /*说明 2 个整型变量 1,j */ char a; /*说明 1 个字符型变量 a */

2.3.2 变量 2. 变量的初始化 定义变量时,只是根据变量的类型分配了存储空间,并没有给该空间指定一个特定的值。该存储空间原来有什么值还是什么值,即是以前遗留的值。因此定义变量后需要给变量初始化,也就是说给变量赋初值。变量初始化可以避免引用到随机变量。

【例 2.5】变量的初始化举例。 int i,j; /*说明 2 个整型变量 i,j */ char a; /*说明 1 个字符型变量 a */ i=1; /* 变量 i 的值为 1 */ j=100; /* 变量 j的值为 100 */ a=′A′; /* 变量 a 的值为大写字母 A */

2.4 数据的输出 在 C 程序中,数据的输入和输出分别是通过调用格

式输入函数、格式输出函数、字符输入函数、字符输出函数来实现的。在 C++ 程序中,主要是通过调用输入输出的流对象来实现的。在输入操作中,输入字节流从输入设备流向内存;在输出操作中,输出字节流从内存流向输出设备。

2.4.1 用 printf 输出数据 程序要按照指定的格式输出,可调用格式输出函数 printf()。调用 printf()的一般格式为:

printf ( 格式控制字符串,输出项表 ) ; 说明:格式控制字符串是字符串表达式,通常是用双引号括

起来的字符串。 格式控制字符串通常包含四类内容: ( 1 )普通字符:要求按原样输出。 ( 2 )转义字符:要求按转义字符的意义输出。转义字符见

表 2-2 所示。 ( 3 )格式转换说明:以“%”开头,后跟修饰符和格式符。

例如% d ,以十进制输出整数。常用的输出格式符见表 2-3 ,常用的输出格式修饰符见表 2-4 。

2.4.1 用 printf 输出数据( 4)输出表项:每个输出项可以是一个常量、变量或表达式。每个格式对应一个输出项,输出函数按指定的格式对输出项的值进行转换,并组织排版输出。

2.4 数据的输出 【例 2.6】格式输出举例。实例给出十进制、八进制、十六进

制和浮点数形式的输出格式控制。分析如下程序的输出结果,理解输出格式符、格式修饰符的作用。源程序如下:

#include "stdio.h"void main(){ printf("%d,%+6d,%6d,%ld\n",1234,1234,1234,1234567L); printf("%#o,%4o,%6lo\n",054,054,-1); printf("%#x,%4x,%6lx\n",054,054,-1);printf("%f,%8.2f,%7.2f,%.7f\n",123.4567f,123.4567f,123.4567f,123.456789);

}

第一行输出代码解释如下:

格式字符串的第一个 d 格式输出整数 1234 ,接着输出普通字符逗号。

第二个 d 格式以 6 个字符的宽度输出 1234 ,并要求输出符号。因此输出一个以空白符和正号为前导的 1234 。接着输出普通字符逗号。

第三个 d 格式以 6 个字符的宽度输出 1234 ,并要求输出时左对齐。因此输出 1234 后接两个空白符。接着输出普通字符逗号。

第四个 d 格式输出长整型数 1234567。

2.4.2 用 scanf 输入数据 要按指定格式组织输入,可调用格式输入函数 scanf()。调

用 scanf()的一般格式为: scanf ( 格式控制字符串,数据存储地址项表 ) ; 说明:格式控制字符串是字符串表达式,通常是用双引号括

起来的字符串。 格式控制字符串通常包含三类内容: ( 1 )普通字符:要求用户必须按原样输入。 ( 2 )格式转换说明:以“%”开头,后跟修饰符和格式符。

例如% d ,以十进制输入整数。常用的输出格式符见表 2-5 ,常用的输出格式修饰符见表 2-6 。

( 3 )数据存储地址表项:每个地址项是一个变量的地址,在变量名前加地址运算符 & 或指针。指针在第 6 章介绍。

2.4.2 用 scanf 输入数据【例 2.7 】格式输入举例。对应下列输入代码,要让变量 x 的值为 11 ,变量 y 的值为 567,经分析指出合理的输入语句应为哪一条?

01 scanf(″%d,%d″,&x,&y); 02 scanf(″%d%d″,&x,&y); 03 scanf(″%2d,%3d″,&x,&y); 04 scanf(″%d%*d%d″,&x,&y);

2.4.2 用 scanf 输入数据 程序说明如下: 语句 01 :″ %d,%d″中间的逗号是普通字符,必须按原样

输入。因此输入为: 11,567。 语句 02: ″%d%d″ 两个格式之间没有其它字符,输入时数据

以一个或多个空格分隔,也可以用 Tab 键或 Enter 键分隔。因此输入为: 11 567。

语句 03 :″%2d,%3d″ 指定了输入的数字符个数,分别时 2个和 3 个。因此输入为: 11567。将 11赋给变量 x , 567赋给变量 y 。

语句 04 :″%d%*d%d″格式中的第二个输入格式有赋值抑制符“ *”,所以要输入 3 个整数,第 2 个数不赋给变量。 3个数输入时由空格分隔。因此输入为: 11 0 567。

2.4.3 用 putchar 输出字符 要输出单个字符可调用字符输出函数 putchar()。

putchar()函数的作用是,将一个字符输出到标准输出设备上,这个设备通常指显示器。调用 putchar ()的一般格式为:

putchar ( ch ) ;其中, ch可以时字符型常量或变量,也可以是整型常量或变量。

2.4.3 用 putchar 输出字符 【例 2.8】 putchar()函数输出举例。在屏幕上输出字符“ China” 。源程序清单如下:#include "stdio.h"void main(){ char ch='h'; int i='i'; putchar(67); /* 输出字母 C,对应的 ASCII 码值为 67(十进制 ) */ putchar(ch); /* 输出字母 h */ putchar(i); /* 输出字母 i */ putchar('n') /* 输出字母 n */ putchar('\141'); /* 输出字母 a,对应的 ASCII 码值为 141( 八进制 )*/ putchar('\n'); /* 换行 */ }

2.4.4 用 getchar输入字符 要输入单个字符可调用字符输出函数 getchar()。 getchar()

函数的作用是,从标准输入设备上读入一个字符,这个设备通常指键盘。调用 getchar ()的一般格式为:

getchar ( ) ; 调用 getchar 函数不需要提供实际参数,调用该函数的返回值就是从输入设备上的得到字符的 ASCII 码值。

2.4.4 用 getchar输入字符 【例 2.9】 getchar()函数输入举例。在屏幕上显示由键盘输入的字符。

源程序清单如下:#include "stdio.h"void main(){ char c; c=getchar (); /* 输入一个字符 */ putchar(c); /* 输出由键盘读入的字符 */ printf("\n"); /* 换行 */}

输入的字符 a显示在屏幕上

输 出 由 键盘读入的字符

2.5 运算符 数据运算是由数据和运算符组成, C 语言有丰富的运算符用

来描述各种数据运算。有些是我们在数学中经常使用的运算符,还有一些是 C 语言特有的运算符。

按照功能划分有赋值运算符、算术运算符、逻辑运算符、关系运算符、条件运算符、增 /减 1 运算符、位逻辑运算符以及一些特殊的运算符。

按照运算对象划分有单目运算、双目运算、三目运算。单目运算是指运算符只有一个操作数,如取反操作;双目运算

“ ”是指运算符有两个操作数,如 + 运算,有两个操作数,加数和被加数。三目运算是指运算符有三个操作数,三目运算是 C语言特有的。

2.5.1 赋值运算符 在程序设计中,赋值的概念很重要。赋值运算符是

“ ” “ ”等号 = ,但是它不是 相等 的意思,而是一个操作过程。所谓赋值是将一个数据值存储到一个变量中,这个数据值可以是常量、变量,还可以是能够求值的表达式。将数据值存储到变量中的过程称为赋值,赋值运算符分为两类:一类是普通赋值运算符;一类是复合赋值运算符。

2.5.1 赋值运算符 ( 1 )普通赋值运算符普通赋值运算的语法格式如下:变量名=表达式;赋值运算的执行过程说明如下:1 )  计算赋值运算符右端的表达式的值。2 )  当赋值运算符两侧的类型不一致时,将表达式值

的类型自动转换成变量的类型。3 )  将表达式的值存储到有变量所占的存储单元中。4 )  赋值语句以分号“;”结束。

2.5.1 赋值运算符【例 2.10】赋值运算举例。假设已有定义 int a,b,c ;则下列赋值语句是正确的。a=10;b=a;c=a+b*2说明:执行上述赋值语句后, a 内存单元的值是 10 ,

b 内存单元的值也是 10 , c 内存单元的值是 30 。

2.5.1 赋值运算符请注意 : 赋值号“=”不是数学上的等号“=”。如果将 x= x+ 1 中的“=”看成数学上的等号,这个式子是不成立的;但是在程序设计中,将 x= x+ 1 中的“=”看成赋值号,则表示将 x存储单元的数据值加上 1 后再存储到 x 单元中。假设 x 中原来的数据值是 1 ,执行赋值语句 x= x+ 1 后, x 中的值变为 2 。

赋值运算符的结合性是“自左向右”的,当连续有多个赋值运算时,时从右向左逐个赋值。

2.5.1 赋值运算符【例 2.11】连续有多个赋值运算时的举例。假设已有定义:int a,b,c,x ;double y ;则下列赋值语句是正确的。a=b=c= 5;y= x= 3.5 ;说明:第一条赋值语句运算时,先将 5赋值给 c ,再将 c 的值

(此时已经为 5 )赋值给 b ,再将 b 的值(此时已经为 5 )赋值给 a 。

第二条赋值语句运算时,将 3赋值给 x ,因为 x 时整型;再将 3.5赋值给 y ,因为 y 时浮点型。

2.5.1 赋值运算符( 2 )复合赋值运算符在程序设计中,经常遇到在变量现有值的基础上作某种修正的

运算。例如:x=x+2y=y-2这类运算的特点是:变量即是参与运算的分量,又是接受赋值

的对象。为了避免对同一个变量的地址重复计算, C/C++ 语言引入复合赋值运算。复合赋值运算把赋值运算符与算术运算符结合在一起,构成 5 个算术复合运算符,+=、-=、*=、 /=、%=。还有把赋值运算符与移位和位逻辑运算符结合在一起,构成 5 个位运算的复合运算符, <<= 、 >>= 、&= 、 ^= 、 |= 。

2.5.1 赋值运算符【例 2.12】复合赋值运算符举例。x+=1; /* 等价于 x=x+1 */x*=u+v; /* 等价于 x=x*(u+v),括号不能省略 */a+=a-=b+2; /* 等价于 a=a+(a=a-(b+2)), 括号不能省略 */说明:用 θ标记一个双目运算符(+、-、 * 、 \ 、%),复

合赋值运算:xθ=e 的等效表达式为: x=xθ(e) 当 e 时一个复杂表达式时,等效表达式的括号时必须的,不

能省略。 赋值运算符和所有复合赋值运算符的优先级全部相同,高于逗号运算符,低于其它所有运算符,并且它们的结合性都是“自左向右”的。

2.5.2 算术运算符( 1 )算术运算符算术运算与数学的数值运算很相似,是 C/C++ 中最简单和最容易理解的运算符。算术运算按运算分量划分,可分为单目运算符和双目运算符两类:

单目运算符: +( 取正 )、– ( 取负 )双目运算符: + 加法 - 减法 * 乘法 / 除法 % 求余

2.5.2 算术运算符说明:尽管算术运算符与数学的数值运算很相近,但是还是有

一些差别,使用时要注意以下几点。( 1 )“ /” 为除法运算符。当除数和被除数均为整数时,结果仍为整数,商向下取整。例如 9/5 结果为 1,10/5 结果为 2,5/9 结果为 0 。若除数和被除数中有一个时浮点数,则与算术中的除法相同。例如 9/5.0 、 9.0/5 、 9.0/5.0 的结果均为1.8 。

( 2 )“%”为求余运算。与数学中的求余运算相同,要求两个操作数都是整数。求与运算结果的符号与被除数的符号相同。例如 3% 2 的结果为 1 , -3% 2 的结果为 -1 ; 3% -2的结果为 1 。

2.5.2 算术运算符【例 2.13】使用 printf 函数显示表达式的值。#include “stdio.h”void main(){ printf(“%d,%d,%d\n”,9/5,10/5,5/9);printf(“%f,%f,%f\n”,9/5.0,9.0/5,9.0/5.0);printf(“%d,%d,%d\n”,3%2, -3%2, 3%-2);}

2.5.2 算术运算符( 2 )算术运算符的优先级 算术运算符的优先级与数学中的算术运算符基本行

同,即先乘除后加减。求余运算符%的优先级与乘除相同。括号的优先级最高,即右括号先算括号内的,然后计算括号外的。

2.5.2 算术运算符( 3 )算术运算符的结合性 运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操作符。

例如: x+y-z 操作数 y左右的运算符级别相同,应该先算 y-z ,还是应该先算 x+y 呢? C 语言规定双目算术运算的结合性是“自左至右”,也就是说, y 先与左边结合,再与右边结合。因此先算 x+y ,然后用 x+y 的结果减 z 。双目运算的结合性与数学运算的规则相同。

2.5.3 关系运算符(关系运算就是比较两个数值大小的运算,比较两个数值大小的

运算符就是关系运算符。一共有 6 个关系运算符,如表 2-7所示。

表 2-7关系运算符运算符 < <= > >= == !=功能 小于 小于等于 大于 大于等于 等于 不等于 在使用关系运算符时要注意以下几点: (1) 6 个关系运算符中的“ ==” 和“ !=” 的优先级小于其它 4

个运算符。 (2) “ ”关系运算符的结合方向是 自左至右 。 (3) 关系运算符的优先级低于算术运算的优先级。当多种运算

符在一个表达式中混合使用时,要注意运算符的优先级,最好使用圆括号明确优先级的顺序。

2.5.3 关系运算符【例 2.14】关系运算符“==”和赋值运算符“=”的区别。#include "stdio.h"void main(){int a,b,c1,c2;a=3;b=3;

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

}

在程序 c1=(a=b)中的 (a=b),表示将 b 的值赋值给 a ,然后再将表达式 (a=b)的值“ 3”赋给 c1 ,因此 c1 的值是3 。在程序 c2=(a==b)中的 (a==b),表示比较 a 和 b 是否相等,这是关系表达式。关系表达式的结果是“真”、“假”值,在 C 语言中,用“ 1” 表示结果为真,用“ 0” 表示结果为假。此处 a 和 b 的值都为 3 ,所以 (a==b)的值为 1 ,并将结果赋值给 c2 。因此程序运行结果为: 3,1 。

2.5.3 关系运算符【例 2.15】算术运算符和关系运算符在一个表达式中混合使用。本例说明在一个表达式中即有算术运算符,又有关系运算符,如何设计更清晰的

表达式。01 #include "stdio.h"02 void main()03 {04 int a,b,c;05 bool i,j;06 a=2;b=3;c=4;07 i=(a<c);08 j=((a<b)<c);09 printf("%2d,%2d,",i,j);10 printf("%2d,",(c<b)==3);11 printf("%2d,",a+b<c);12 printf("%2d \n ",c+2>=b+2);13 }

程序说明:( 1 )该程序在 VC++6.0 中调试。语句 05 中变量 i,j定义为 bool 布尔型变量;如果定义为 int整型变量,编译时出现警告错误。( 2)语句 07 表达式 i=(a<c) “中 <” “的优先级高于 =”,先计算 a<c,结果是 1(为真),再赋值给 i, i的结果是 1。( 3 )语句 08 表达式 j=((a<b)<c) “中的 <” “的优先级高于 =”,先计算 a<b,结果是 1(为真);然后再计算 1<c, 结果是 1(为真);再赋值给 j, j的结果是 1。( 4 )语句 09 输出 i,j “的值,是输出窗口中的前两个 1”。( 5 )语句 10 表达式 (c<b)==3 “中的 <” “的优先级高于 ==”, 先计算 (c<b),结果是 0(为假);然后判断 0==3,结果是 0 “(为假);是输出窗口中的第三个值 0” 。( 6 )语句 11 表达式 a+b<c “中的 +” “的优先级高于 <”, 先计算 (a+b),结果是 5;然后判断 5<c,结果是 0 “(为假);是输出窗口中的第四个值 0” 。( 7)语句 12 表达式 c+2>=b+2 中的“ +” 的优先级高于“ >=”, 先计算 (c+2)的值,结果是 6 ;再计算 (b+2)的值,结果是 5 ;然后判断 6>=5 ,结果是 1 (为真);是输出窗口中的第五个值“ 1” 。( 8 )在 C 语言的程序设计中,提倡使用圆括号来明确地区分运算的先后顺序,以避免二义性,使程序产生不正确的结果。

2.5.4 逻辑运算符 逻辑运算用于判断分析,逻辑运算的操作数和运算结果均为逻辑值。一共有 3个逻辑运算符,如表 2-8所示。

2.5.4 逻辑运算符 C 语言系统对于任何非 0 的值都认为是逻辑真,仅将 0 认为是逻辑假。例如, 3&&5 的值是 1 ,因为 3 和 5 都是非 0值,按照规则,逻辑真与逻辑真的计算结果为逻辑真,表示为整数 1 。

在逻辑运算中,逻辑非“!”的优先级最高,其次是逻辑与“ &&” ,逻辑或“ ||” 的优先级最低。与其它运算符相比,逻辑与“ &&” 和逻辑或“ ||” 的优先级低于关系运算符的优先级;逻辑非“!”的优先级高于算术运算符的优先级。

“ ” “ ” “逻辑非 ! 是单目运算符,其结合性是 自右向左 ;逻辑与 &&” “和逻辑或 ||” “ ”是双目运算符,其结合性是 自左向右 。如果不用圆括号表示运算的先后次序,而将算术、关系、逻辑等运算符混合用于一个表达式,其运算结果是一个很难分析的事情。

2.5.4 逻辑运算符【例 2.16】算术、关系、逻辑运算符在一个表达式中混合使用。源程序清单如下:01 #include "stdio.h"02 void main()03 {04 int a,b,c;05 bool i,j;06 a=2;b=3;c=4;07 i=((a+6)<c);08 j=(((7<8)&&i)||((b+6)>(8-(!0))));09 printf("%2d,%2d \n ",i,j); 10 }

2.5.5 条件运算符条件运算是 C 语言中唯一一个三目运算,条件运算的运算符为

(?:),需要三个操作数。条件运算的语法格式为: 表达式 1 ?表达式 2 :表达式 3条件运算的执行过程是:( 1 )首先计算表达式 1 的值。( 2)如果表达式 1的值为非 0(真),则计算表达式 2,并以表达式 2为条件运算的结果,不在计算表达式 3。

( 3 )如果表达式 1 的值为 0 (假),则计算表达式 3 ,并以表达式 3 为条件运算的结果,不在计算表达式 2 。

条件运算符(?:)的优先级高于赋值运算符,低于逻辑运算符,“也低于关系运算符和算术运算符。条件运算符的结合性为 自

”右向左 。

2.5.5 条件运算符条件运算是 C 语言中唯一一个三目运算,条件运算的运算符为

(?:),需要三个操作数。条件运算的语法格式为: 表达式 1 ?表达式 2 :表达式 3条件运算的执行过程是:( 1 )首先计算表达式 1 的值。( 2)如果表达式 1的值为非 0(真),则计算表达式 2,并以表达式 2为条件运算的结果,不在计算表达式 3。

( 3 )如果表达式 1 的值为 0 (假),则计算表达式 3 ,并以表达式 3 为条件运算的结果,不在计算表达式 2 。

条件运算符(?:)的优先级高于赋值运算符,低于逻辑运算符,“也低于关系运算符和算术运算符。条件运算符的结合性为 自

”右向左 。

2.5.5 条件运算符条件运算是 C 语言中唯一一个三目运算,条件运算的运算符为

(?:),需要三个操作数。条件运算的语法格式为: 表达式 1 ?表达式 2 :表达式 3条件运算的执行过程是:( 1 )首先计算表达式 1 的值。( 2)如果表达式 1的值为非 0(真),则计算表达式 2,并以表达式 2为条件运算的结果,不在计算表达式 3。

( 3 )如果表达式 1 的值为 0 (假),则计算表达式 3 ,并以表达式 3 为条件运算的结果,不在计算表达式 2 。

条件运算符(?:)的优先级高于赋值运算符,低于逻辑运算符,“也低于关系运算符和算术运算符。条件运算符的结合性为 自

”右向左 。