第
This presentation is the property of its rightful owner.
Sponsored Links
1 / 60

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


  • 123 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


2

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

本章主要内容:

2.1基本符号和标识符

2.2基本数据类型

2.3常量与变量

2.4数据的输出

2.5运算符

2.6表达式


2

2.1基本符号和标识符

  • 如同自然语言一样,程序设计语言也有基本符号,再由基本符号按一定的构词规则构成基本词汇,最后按语言的句法由基本词汇组成源程序。C语言的基本符号和标识符如下。


2 1 1

2.1.1 基本符号

  • 基本符号即字符集,是高级语言的编译系统所能识别的字母、数字和特殊符号。每种高级语言都有自己特定的基本符号。C语言的基本符号由一下七类:

  • 数字:0~9十个数字。

  • 英文字母:大写字母26个(A~Z);小写字母26个(a~z)

  • 括号:(),[ ],{}

  • 运算符:+ - * / = > < % & | ? ! ^ ~

  • 标点符号:’” : ;


2 1 11

2.1.1 基本符号

  • 特殊符号: \ _ $ #

  • 空白符:空格符、换行符、制表符

  • 基本符号中的字符按照C语言的语法规则组合起来,就能通过编译系统的语法和词法分析。不在基本符号中的字符可以用双引号括起来,形成字符串后出现在语句中。例如“、”,[email protected]


2 1 2

2.1.2 标识符

  • 标识符是用来命名变量、常量、类型、函数、语句等程序对象的,是一个字符序列。在C语言程序中,一个合理的标识符由英文字母或下划线开头,后接零个或任意个字母、下划线,其长度不超过8个。

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


2 1 21

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 22

2.1.2 标识符

  • 2 特定字

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

  • define undef include ifdef ifndef endif line elif


2 1 23

2.1.2 标识符

  • 3 用户定义字

  • 用户定义字是程序员在程序设计时为变量、常量、函数等程序对象其起的名字。为了便于联想和记忆,建议用户给程序对象命名时,使用能反映该对象意义的定义字。通常要注意一下几点:

  • (1)不能使用关键字和特定字。

  • (2)为了区别不同的程序对象,用户定义字的前8个字符不能相同。

  • (3)最好使用英文和汉语拼音缩写,以便阅读和检查。

  • (4)C语言区别大小写,大、小写代表不同的意义。如TEXT和text代表不同的标识符。

  • (5)避免使用容易混淆的字符。如1与I,0与o,2与z等。

  • (6)C语言由许多库函数,用户定义字不能与库函数同名。


2

2.2数据类型

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


2 2 1 c

2.2.1 C语言数据类型


2 2 1 c1

2.2.1 C语言数据类型

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

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

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


2 2 2

2.2.2 基本数据类型

短整型 short int

(1)整型 长整型 long int

普通整型 int

普通浮点型 float

(2)浮点型

双精度浮点型 double

(3)字符型 char

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


2

2.3常量与变量

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

  • 2.3.1 常量

  • 常量是指取值在程序的执行过程中始终保持不变的量。根据取值和表示方法的不同,常量有如下类型:

  • 1. 整型常量

  • 整型常量的表示通常有三种:十进制表示、八进制表示、十六进制表示。

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


2 3 1

2.3.1常量

  • 【例2.1】整型常量举例。

  • Int x,y,z

  • X=10;

  • Y=010;

  • Z=0x10;

  • 执行上述程序后,变量x中的数据值是十进制数10;变量y中的数据值是十进制数8;变量z中的数据值是十进制数16。


2 3 11

2.3.1常量

  • 2. 浮点型常量

  • 在数学上,表示小数由两种方式:一种是小数表示法,另一种是科学计数法,也称指数表示法。浮点数表示法来源于数学中的指数表示形式,如193.5可以表示为0.1935103或1.935102等。

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


2 3 12

2.3.1常量

  • C程序中的浮点常数由整数部分、小数部分和指数部分构成。

  • 其中,整数部分和小数部分用小数点连接;小数部分和指数部分用e或E连接。

  • 浮点常量的构成规则是:

  • (1)整数部分和小数部分可以不写,但不能同时不写。

  • (2)指数部分可以省略,省略时相当于小数表示法。

  • (3)若有指数部分,e(或E)两边至少有一位数。

  • (4)指数的数字必须是整数(1~3位),可以有正负号,正号可省略。


2 3 13

2.3.1常量

  • 【例2.2】浮点型常量举例。

  • Float x,y,z

  • X=4.50e3

  • Y=1.235e-3

  • Z=1.058

  • 执行上述程序后,变量x中的数据值是十进制数4500;变量y中的数据值是十进制数0.001235;变量z中的数据值是十进制数1.058。


2 3 14

2.3.1常量

  • 3. 字符型常量

  • 在C语言中的字符常量是用单引号括起来的一个字符。

  • 字符常量的构成规则是:

  • (1)单引号中的字符只能有一个。

  • (2)字符仅能用单引号,不能使用双引号定义字符常量。

  • (3)非图形字符也可以表示成字符常量,如退格、换行。表示方法是使用转义符\与一些特殊字符构成转义序列。例如’\n’表示“回车换行”。

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


2 3 15

2.3.1常量


2 3 16

2.3.1常量

  • 4. 字符串常量

  • 在C中用双引号引起来的若干个字符称为字符串常量。例如:“welcome”, “198.75”。字符串常量在内存中是按顺序逐个存储的,存储的是字符串的ASCII码,并在最后一个存储单元存放一个“\0”字符,表示串结束。字符串的长度是指串中“\0”字符之前的所有字符数量,包括不可见字符。因此字符串常量实际占用的字节数是:串长+1。


2 3 17

2.3.1常量

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

  • 图2-3 字符串常量存储示意图

  • 字符串的输出有两种方法:

  • 直接输出:printf(“welcome”);

  • 转换输出:printf(“%s”,“welcome”);


2 3 18

2.3.1常量

  • 5. 指针常量

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


2 3 2

2.3.2 变量

  • 变量是指取值在程序的执行过程中取值可以改变的量。

  • 在使用一个变量之前,程序员必须为每个变量起一个名字,并定义它的数据类型。也就是说,变量必须用标识符进行标识,该标识符称为变量名。

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

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


2 3 21

2.3.2 变量

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

  • (1)编译系统会根据定义为变量预先分配内存空间;

  • (2)未经定义的标识符,系统不允许作为变量名使用;

  • (3)便于在编译期间进行语法检查。不同类型的变量有其相应的合法操作,编译系统会根据变量的类型对其操作的合法性进行检查。


2 3 22

2.3.2 变量

  • 1. 定义变量的格式

  • 类型说明符 变量名表 ;

  • 说明:类型说明符 指定了变量的数据类型,可以是int、float、double、char等。

  • 变量名 要符合用户定义字的命名规则,一般使用小写字母。

  • 变量名表 一种类型有多个变量时,变量名之间用逗号“,”分隔。类型说明语句用分号结束。

  • 【例2.4】定义2个整型变量,1个字符型变量。

  • int i,j; /*说明2个整型变量1,j */

  • char a; /*说明1个字符型变量 a */


2 3 23

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

2.4数据的输出

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


2 4 1 printf

2.4.1 用printf输出数据

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

  • printf ( 格式控制字符串,输出项表 ) ;

  • 说明:格式控制字符串是字符串表达式,通常是用双引号括起来的字符串。

  • 格式控制字符串通常包含四类内容:

  • (1)普通字符:要求按原样输出。

  • (2)转义字符:要求按转义字符的意义输出。转义字符见表2-2所示。

  • (3)格式转换说明:以“%”开头,后跟修饰符和格式符。例如%d,以十进制输出整数。常用的输出格式符见表2-3,常用的输出格式修饰符见表2-4。


2 4 1 printf1

2.4.1 用printf输出数据

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


2

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

2.4.2 用scanf输入数据

  • 要按指定格式组织输入,可调用格式输入函数scanf()。调用scanf()的一般格式为:

  • scanf ( 格式控制字符串,数据存储地址项表 ) ;

  • 说明:格式控制字符串是字符串表达式,通常是用双引号括起来的字符串。

  • 格式控制字符串通常包含三类内容:

  • (1)普通字符:要求用户必须按原样输入。

  • (2)格式转换说明:以“%”开头,后跟修饰符和格式符。例如%d,以十进制输入整数。常用的输出格式符见表2-5,常用的输出格式修饰符见表2-6。

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


2 4 2 scanf1

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 scanf2

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

2.4.3用putchar输出字符

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

  • putchar ( ch ) ;

  • 其中,ch可以时字符型常量或变量,也可以是整型常量或变量。


2 4 3 putchar1

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

2.4.4 用getchar输入字符

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

getchar ( ) ;

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


2 4 4 getchar1

2.4.4 用getchar输入字符

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

源程序清单如下:

#include "stdio.h"

void main()

{

char c;

c=getchar (); /* 输入一个字符 */

putchar(c); /* 输出由键盘读入的字符 */

printf("\n"); /* 换行 */

}

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

输出由键盘读入的字符


2

2.5运算符

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

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

按照运算对象划分有单目运算、双目运算、三目运算。单目运算是指运算符只有一个操作数,如取反操作;双目运算是指运算符有两个操作数,如“+”运算,有两个操作数,加数和被加数。三目运算是指运算符有三个操作数,三目运算是C语言特有的。


2 5 1

2.5.1赋值运算符

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


2 5 11

2.5.1赋值运算符

(1)普通赋值运算符

普通赋值运算的语法格式如下:

变量名=表达式;

赋值运算的执行过程说明如下:

1)计算赋值运算符右端的表达式的值。

2)当赋值运算符两侧的类型不一致时,将表达式值的类型自动转换成变量的类型。

3)将表达式的值存储到有变量所占的存储单元中。

4)赋值语句以分号“;”结束。


2 5 12

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 13

2.5.1赋值运算符

请注意:

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

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


2 5 14

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 15

2.5.1赋值运算符

(2)复合赋值运算符

在程序设计中,经常遇到在变量现有值的基础上作某种修正的运算。例如:

x=x+2

y=y-2

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


2 5 16

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

2.5.2 算术运算符

(1)算术运算符

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

单目运算符:+(取正)、–(取负)

双目运算符:+ 加法

- 减法

* 乘法

/ 除法

% 求余


2 5 21

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 22

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 23

2.5.2 算术运算符

(2)算术运算符的优先级

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


2 5 24

2.5.2 算术运算符

(3)算术运算符的结合性

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

例如:x+y-z

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

双目运算的结合性与数学运算的规则相同。


2 5 3

2.5.3关系运算符

(关系运算就是比较两个数值大小的运算,比较两个数值大小的运算符就是关系运算符。一共有6个关系运算符,如表2-7所示。

表2-7关系运算符

运算符 < <= > >= == !=

功能 小于 小于等于 大于 大于等于 等于 不等于

在使用关系运算符时要注意以下几点:

(1) 6个关系运算符中的“==”和“!=”的优先级小于其它4个运算符。

(2) 关系运算符的结合方向是“自左至右”。

(3) 关系运算符的优先级低于算术运算的优先级。当多种运算符在一个表达式中混合使用时,要注意运算符的优先级,最好使用圆括号明确优先级的顺序。


2 5 31

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 32

程序说明:

(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.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 }


2 5 4

2.5.4 逻辑运算符

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


2 5 41

2.5.4 逻辑运算符

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

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

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


2 5 42

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

2.5.5条件运算符

条件运算是C语言中唯一一个三目运算,条件运算的运算符为(?:),需要三个操作数。

条件运算的语法格式为:

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

条件运算的执行过程是:

(1)首先计算表达式1的值。

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

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

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


2 5 51

2.5.5条件运算符

条件运算是C语言中唯一一个三目运算,条件运算的运算符为(?:),需要三个操作数。

条件运算的语法格式为:

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

条件运算的执行过程是:

(1)首先计算表达式1的值。

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

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

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


2 5 52

2.5.5条件运算符

条件运算是C语言中唯一一个三目运算,条件运算的运算符为(?:),需要三个操作数。

条件运算的语法格式为:

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

条件运算的执行过程是:

(1)首先计算表达式1的值。

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

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

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


  • Login