第2章 数据类型、运算符与表达式05_第1页
第2章 数据类型、运算符与表达式05_第2页
第2章 数据类型、运算符与表达式05_第3页
第2章 数据类型、运算符与表达式05_第4页
第2章 数据类型、运算符与表达式05_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

12.1数据类型2.2常量与变量2.3运算符与表达式2.4标准输入/输出2.5数学函数2.6随机数发生器函数2.7案例应用第2章数据类型、运算符与表达式2数据在计算机中的存储计算机内部的信息都是用二进制表示计算机存储器是用半导体集成电路构成的有两种稳定的工作状态:“导”与“截止”,即电脉冲的“有”与“无”分别用“1”和“0”表示一、数据在计算机中是以二进制形式存储的3数据在计算机中的存储若相邻的8个二极管元件中第1,3,5,7个元件处于“导通”状态,第2,4,6,8个元件处于“截止”状态,用“10101010”表示。导通截止导通截止导通截止导通截止101010104数据在计算机中的存储十进制数二进制数001121031141005101十进制数二进制数6110711181000910011010105数据在计算机中的存储位(bit),又称“比特”。每一个二极管元件称为一个“二进制位”,是存储信息的最小单位。它的值是“1”或“0”。字节(byte),又称“拜特”。一般将8个“二进制位”组织成一组,称为“字节”。这是人们最常用的存储单位。二、位、字节和地址6数据在计算机中的存储二、位、字节和地址200120022003200420052006

地址:计算机的存储器包含许多存储单元,操作系统把所有存储单元以字节为单位编号。345789┆71.1数据类型枚举类型(enum)基本类型数据类型构造类型指针类型空类型(void)整型(int)实型(浮点型)字符型(char)结构体(struct)共用体(union)单精度实型(float)双精度实型(double)数组8一、整型类型名称类型说明符所占字节数取值范围有符号基本整型[signed]int4-2147483648~2147483647-232-1~232-1-1有符号短整型[signed]short[int]2-32768~32767-216-1~216-1-1有符号长整型[signed]long[int]4-2147483648~2147483647-232-1~232-1-1无符号基本整型unsigned[int]40~42949672950~232-1无符号短整型unsignedshort[int]20~655350~216-1-1无符号长整型unsignedlong[int]40~42949672950~232-19一、整型

数据存储时在内存中所占字节数与具体的机器及系统有关。如int类型,在32位系统中VisualC++下所占4个字节,但是在TurboC下int只占2个字节,表示范围就是:-32768~32767。

编程时,可以用运算符sizeof()求出所使用环境中int类型究竟占用几个字节。1016位系统:long是4字节,int是2字节

32位系统:long是4字节,int是4字节

64位系统:long是8字节,int是4字节C语言又规定,无论什么平台,都要保证long型占用的字节数不小于int型程序的开发又不只是一个平台,在多平台的情况是不同的,所以程序还要注重可移植性,11一、整型

整数类型是以二进制数据形式存储的,确切地说是以二进制补码形式。12一、整型整数的存储方式一个十进制整数,先转换为二进制形式如整数15,以二进制形式表示是1111000011110000000000001111用一个字节存放用两字节存放负数按补码形式存放请问:-15又是如何存储的呢?符号位。0表示正符号位。0表示正13负数以其补码形式存在:补码=原码取反+1

一个字节有8位可以表示的数值范围在-128到+127

二进制表示:10000000-01111111(注意:最高位表示符号)

最高位是1的都是负数最高位是0的都是正数如-7

原码:10000111

取反:11111000(最高位是符号不用取反)加一:11111001

即-7的二进制数就是11111001

-10

原码:10001010取反:11110101加一:11110110-10的二进制数就是11110110

14二、实型C语言中实型也称为浮点型,包括单精度实型和双精度实型。实型与整型的区别在于是否包含小数部分,比如6是整数类型,6.00是实数类型。类型名称类型说明符所占字节数有效数字取值范围(绝对值)单精度实型float4约6~7位3.4×10-38~3.4×1038双精度实型double8约15~16位1.7×10-308~1.7×1030815二、实型实数的存储形式实型数据按指数形式存储,分为小数部分(尾数)和指数部分(阶码)分别存放。123.456标准化指数形式为0.123456103+.12345+3数符

数值部分指数符号指数float数据机器内是2进制数,

1位符号位;8位指数位;23位“尾数”位;共32位2进制数。平时讲有效数字是6~7位,指10进制。

通常程序输入的数是10进制,进入机器后要化成2进制,计算完又转十进制输出。

10进制到2进制,2进制到10进制转换,有的数化不净,有的数化得净。

如同10进制分数化10进制小数,有的化得净(例如4分之1,变0.25),有的化不净(例如3分之1,变0.33333....)。

10进制到2进制,2进制到10进制转换,化得净的效数字7位,化不净的效数字6位,因为最后一位有舍入误差。

例如:

floatx,y;

x=0.51;//化不净

y=0.5;//化得净

printf("x=%.8fy=%.8f",x,y);//输出0.509999990.5000000017三、字符型类型说明符为char。字符型数据只占1个字节,只能存放1个字符。为了处理字符,计算机使用一种数字编码,用特定的整数表示特定的字符。应用最广泛的是编码是ASCII码(AmericaStandardCodeforInformationInterchange,美国信息交换标准码)

大写字母A的ASCII码为65,小写字母a的ASCII码为97,字符‘0’为48。18三、字符型字符的存储方式对于字符,按ASCII代码存放A的ASCII代码是65(1000001)01000001用一个字节存放

由于这种与整型数据类似的存储方式,在1个字节(0~255)范围内,字符型数据和整形数据可以通用。19四、枚举型

如果一个数据对象只有几种可能的取值,可以将这些值一一列举出来,即定义为枚举类型。定义的格式为:

enum

枚举类型名

{枚举常量1,枚举常量2,...,枚举常量n};20五、构造数据类型C语言的基本数据类型并不能满足实际应用中的所有需求,用户可以利用整型、实型、字符型这些基本数据类型构造满足需要的数据类型,即构造类型。数组类型构造类型结构体类型共用体类型21六、其他数据类型指针类型。

指针是一种特殊的数据类型,也是很重要的一种数据类型,指针的值指的是内存中的地址值。空类型

C语言中空类型用void表示,一般用于描述指针以及作为不返回值的函数的返回值类型。222.2常量与变量

在程序所处理的各种数据中,有些数据的值在程序使用前可以预先设定并在程序运行过程中不会发生变化,称为常量。有的数据在程序运行过程中可能会变化,称为变量。

两者的区别在于数据在程序运行过程中其值是否变化。232.2.1常量在程序运行过程中,其值不变的量称为常量。常量区分为不同的类型:整型常量100,125,-100,0实型常量3.14,0.125,-3.789字符型常量‘a’,‘b’,‘2’字符串常量‘a’,‘ab’,‘1232’以上四种称为字面常量。还有一种叫符号常量。24一、整型常量

整型常量即整常数。在C语言中,整常数可用以下三种形式表示:十进制整数:用10个数字0~9表示,如369,9652。八进制整数:以数字0开头,用8个数字0~7表示。如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。十六进制整数:以0X或0x开头(注意是数字0加字母X或x),用10个数字0~9和6个字母A~F(或a~f)表示。如:0x123,代表16进制数123,等于十进制数

291。

-0x12等于十进制数-18。注意:正整数前面的“+”号可以省略。25一、整型常量常量的后缀表示列举如下:常量类型

十进制数

八进制

十六进制

十进制的值长整型

12L 014L0XCL 12无符号整型

15u 017u 0xfu15注意:C把大多数整数常量识别为int类型,如果整数特别大,将会有不同的处理。比如,在程序中使用254时,通常会识别为int类型。当使用的整数超出了int类型的范围时,则识别为long类型,或unsignedlong类型。26二、实型常量实型常量的表示形式:十进制形式:由数字0~9和小数点组成(必须有小数点)。

如:0.123

指数形式:由尾数、E(或e)和整数指数(阶码)组成。

如:3e-3注意:整数或小数部分的数字可以省略,但二者不能同时省略并且小数点不能省略。字母e(或E)之前必须有数字,可以是整数或实数,且e后面的指数必须为整数。27二、实型常量在实型常量中不能有空格。默认状态下,实型常量被识别为双精度(double)类型。可以使用后缀F或f表示单精度(float)类型,后缀L或l表示长双精度(longdouble)类型。比如123.56是double类型,123.56f是float类型,1.2356E2L是longdouble类型。1.2、7.、.36、1e3、1.8e-3、-.1e-30、1.23、e3、2.1e3.5、.e3、e

28三、字符常量(1)用单引号括起来的一个字符是字符型常量。(2)只能包含一个字符。注意:使用字符常量时要注意数字字符和数字的区别,例如,写法'5'表示符号5,而不是数值5,字符5的ASCII码值是53。例‘a’,’A’,‘1’‘abc’、“a”29三、字符常量

有些以“\”开头的特殊字符称为转义字符。\n换行\t横向跳格\r回车\\反斜杠\ddd

ddd表示1到3位八进制的ASCII代码\xhh

hh表示1到2位十六进制的ASCII代码例:字母A有3种表示,’A’,’\101’,’\x41’‘\0’

与‘0’是有区别的字符类型的数据也可参与四则运算30四、字符串常量字符串常量是一对双撇号括起来的字符序列.合法的字符串常量:

"Howdoyoudo.","CHINA","a",

"$123.45"可以输出一个字符串,如

printf("Howdoyoudo.");注意:"a"表示的是一个字符串常量

'a'表示的是一个字符常量31四、字符串常量字符串常量与字符常量的区别:(1)字符常量是由单引号括起来,而字符串常量则是由双引号括起来。(2)字符常量只能表示一个字符,而字符串常量则可以包含1个或多个字符。(3)可以将1个字符常量赋值给一个字符变量,但不能将1个字符串常量赋予一个字符变量。(4)字符常量在存储中只占一个字节,字符串常量占用的存储空间的字节数等于双引号中所包含字符个数加1(结束符‘\0’)。32四、字符串常量(5)字符串中可以有转义字符。(6)单引号和双引号只是字符和字符串的定界符,如果字符常量本身是单引号,则要用转义字符,如‘\’’

。空字符作为字符串常量的结束'a'是一个字符常量"a"是一个字符串常量aa\033五、符号常量

用一个标识符来代表一个常量,称为符号常量。符号常量在使用前必须先定义,用宏定义的形式,其一般定义格式为:

#define

标识符常量例:

#definea20定义符号常量名时应尽量做到“见名知意”,

#definePRICE2034五、符号常量#include<stdio.h>#definePRICE10//定义价格符号常量PRICE为10voidmain(){

int

num,total;

scanf(“%d”,&num); //输入购买数量

total=num*PRICE; //计算总金额

printf(“total=%d”,total);}35五、符号常量符号常量的性质和使用方法:1、#define不是C语句,该行的末尾没有分号。它是一个“预编译命令”。2、不要把符号常量与变量混淆,符号常量只是一个符号,不占存储单元。它只是简单地进行字符置换(如把字符PRICE置换为字符10)。不论置换的字符是否有含义都进行置换。3、习惯上,符号常量名用大写,变量名用小写,以示区别。4、使用符号常量的好处

含义清楚在需要改变一个常量时能做到“一改全改”。

#include<stdio.h>#definePI3.14intmain(){doubles,c,r=10;s=PI*r*r;c=2*PI*r;

printf(“s=%f“,s);

printf(“c=%f“,c);return0;}36变量是指在程序运行过程中其值可以变化的量。C语言要求在使用变量之前必须先进行声明。给变量指定一个标识符,这个标识符称为变量名;变量名(标识符)的命名规则:只能由字母、数字或下划线组成;第一个字符必须是字母或下划线。2.2.2变量37声明一个变量包括:指定该变量的数据类型,该类型决定了变量值的类型、表现形式和占用内存空间,以及对该变量能执行的运算;指定变量的存储类型和变量的作用域。1、变量的声明变量声明的一般形式:

[存储类型说明符]数据类型说明符变量名1[,变量名2,变量名3,…]381、变量的声明☆变量名必须是一个合法的标识符,还应考虑“见名知意”的原则。☆类型说明符后声明多个相同类型的变量,各变量之间用逗号分隔。☆变量声明必须放在变量使用之前,即先声明,后使用。//变量声明示例#include<stdio.h>voidmain(){

int

a,b;

//声明两个整型变量a和bcharc;

//声明一个字符变量c

floatf1,f2;

//声明两个浮点型变量f1,f2}数据类型说明符39声明变量,只是给变量分配内存空间,存储空间中存放的值是随机的,变量值不确定的。C语言允许在声明变量的同时给变量赋值即初始化变量,这个值为变量的初值。2、变量的初始化在变量声明中初始化赋值的一般格式为:

[存储类型说明符]数据类型说明符变量名1=值1[,变量名2=值2,…];☆多个变量初始化赋值必须将其分别赋值,即使所赋的值相同也是如此。

inti=j=20;(错误)应写成:

inti=20,j=20;402、变量的初始化//变量声明及初始化#include<stdio.h>voidmain(){charc1=‘a’,c2=‘b’;/*声明c1和c2为字符类型变量,

c1初始化值分别为字符'a'、'b‘*/

inti=20,j=20,k;/*声明i,j和k为基本整型变量,

i和j初始化值为20*/ floatf1=3.6,f2;/*声明f1和f2为单精度类型变量,

f1初始化值为3.6*/} 412、变量的初始化要注意区别变量名和变量值:

intk=26;26k3000存储单元变量名变量地址变量值42(1)整型变量

有基本整型、短整型、长整型、无符号基本整型、无符号短整型、无符号长整型6种。3、变量的使用

☆在程序中使用变量,要考虑程序运行的环境和变量的取值范围,当变量的取值超出变量类型所规定的范围时,会出现错误的运算结果。//整型变量的定义与使用#include<stdio.h>voidmain(){

inta=-10,b=20,c;

//声明基本整型变量a、b、c,

//并对a,b初始化

unsignedk;

//声明无符号基本整型变量k

scanf(“%u”,&k);

//用scanf()函数给k输入一个值(无符号整数)

c=a+b;

//将a、b的和赋值给c

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

//用printf()函数输出c、k的值

} 43

☆使用整型变量时要注意它获取的值不要超过变量的取值范围,否则会发生“溢出”。3、变量的使用//整型数据的溢出#include<stdio.h>voidmain(){shortx=32767,y;y=x+1;

printf("x=%d,y=%d\n",x,y);}

☆因为一个短整型变量所能表示数的范围是-32768-32767,将无法表示大于32767的数,这种情况叫溢出。而程序在运行过程中并没有报错。44(1)实型变量

分为单精度实型和双精度实型,两者的区别在于精度即有效数字位数。//实型变量的有效位数#include<stdio.h>voidmain(){

float a=33.3333333333;doubleb=12.123456789012345678;

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

//格式符%21.18f,输出a时总长度21位,小数位数占18位

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

} 3、变量的使用float类型的数据只接收7位有效数字

double类型的数据接收16位有效数字

45在使用实型变量时应该注意以下两种情况:①实型常量没有加后缀F(或f)时,系统默认为double类型进行处理,具有较高精度,把该实型常量赋值给一个float类型的变量时,系统会截取相应的有效位数进行赋值。②应避免将很大的数和一个很小的数进行加减运算,否则会丢失“较小”的数。//实型数据的舍入误差。#include<stdio.h>voidmain(){floata=123456789.0,b;b=a+1;

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

3、变量的使用只能保证前7位是准确的,后面几位是无效数字,把1加在无效数字上,是无意义的。

46(1)字符型变量每个字符变量占一个字节的内存空间,存放一个字符,即字符变量的取值是一个字符常量。可以把字符型数据作为整型数据进行处理。允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型形式输出,也允许把整型数据按字符形式输出。注意,整型为4个字节,字符为1个字节,当整型按字符型量处理时,只有低八位参与处理。//字符型变量示例#include<stdio.h>voidmain(){

chara,b;a='x';b='y';a=a-32;b=b-32;

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

}

3、变量的使用472.3运算符与表达式2.3.1运算符2.3.2表达式2.3.3类型转换48C语言的运算符有以下几类:

⑴算术运算符(+-*/%)⑵关系运算符(><==>=<=!=)⑶逻辑运算符(!&&||)⑷位运算符(<<>>~|∧&)⑸赋值运算符(=及其扩展赋值运算符)⑹条件运算符(?:)⑺逗号运算符(,)(8)指针运算符(*和&)(9)求字节数运算符(sizeof)(10)强制类型转换运算符((类型))(11)分量运算符(.->)(12)下标运算符([])(13)其他(如函数调用运算符())2.3.1运算符492.3.1运算符使用运算符需要注意以下几点:

⑴运算符的功能⑵对操作数(即运算对象)的要求操作数的个数;操作数的数据类型。⑶运算符的优先级别⑷运算符的结合方向⑸运算结果参见附录B501、算术运算符+

(加法运算符,或正值运算符。如:3+5、+3)-(减法运算符,或负值运算符。如:5-2、-3)*(乘法运算符。如:3*5)/(除法运算符。两个整数相除的结果为整数,如:5/3结果为1)%(模运算符,或称求余运算符,%两侧均应为整型数据,如:7%4的值为3)。注:1、/:如果两个整数相除,结果为整数(整除),结果“向零取整”。例:8/5=1,8/-5=-1,-8/5=-1,8.0/5=1.6。

2、%:结果的符号与被除数符号相同。例:8%5=3,-8%5=-3,8%-5=3。51//算术运算符#include<stdio.h>intmain(){inta=3,b=5;printf("%d\n",a+b);printf("%d\n",a-b);printf("%d\n",a*b);printf("%d\n",a/b);printf("%d\n",a%b);return0;} 54不能写为ab52(4.0/3)*x*x*x(4/3)x3sin(x)+exp(x)sinx+exsqrt(a*a+b*b)(x+y)/(x-y)3*a+4*b3a+4bC表达式数学表达式110532、自增、自减运算符作用是使变量的值增1或减1++i,--i:在使用i之前,先使i的值加(减)1i++,i--:在使用i之后,使i的值加(减)1

注:由于自增和自减可以改变操作数自身的值,因此其运算对象只能是一个变量。整型、实型、字符型、指针类型变量均可作为其运算对象。变量x初值表达式运算后x的值运算后表达式的值2++x332x++322--x112x--12542、自增、自减运算符//自增自减综合应用#include<stdio.h>voidmain(){

inti=8;

printf(“%d\n”,++i);

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

printf(“%d\n”,i++);

printf(“%d\n”,i--);

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

printf(“%d\n”,-i--);

printf("%d\n",i);}

//输出9//输出8//输出8,但i的值为9//输出9,但i的值为8//输出-8,但i的值为9//输出-9,相当于-(i--)//此时输出多少呢?55例:设inti=3,j=4;作j=(i++)+j

运算后,j的值为▁▁▁,i的值为▁▁▁。设inti=3,j=4;作j=(++i)+j

运算后,j的值为▁▁▁,i的值为▁▁▁。563、赋值运算符

“=”是赋值运算符作用是将一个数据赋给一个变量也可以将一个表达式的值赋给一个变量例:a=20;的作用是“将值20赋给变量a”。

赋值表达式一般形式为:

变量

赋值运算符

表达式对赋值表达式求解的过程:求赋值运算符右侧的“表达式”的值赋给赋值运算符左侧的变量573、赋值运算符赋值运算符左侧的标识符称为“左值”

出现在赋值运算符右侧的表达式称为“右值”

注意:并不是任何对象都可以作为左值的,表达式和常变量就不能作为左值。任何左值都可做右值。赋值表达式“a=3*5”

对表达式求解后,将表达式的值15赋值给变量a“a=(b=5)”和“a=b=5”等价583、赋值运算符注意:并不是任何对象都可以作为左值的,表达式和常变量就不能作为左值。任何左值都可做右值。(a=b)=c=5

a+b=x+b

5=a+b#definePI3.14PI=3.1415926;593、赋值运算符两侧类型一致时,直接赋值两侧类型不一致,但都是数值型或字符型,自动将右侧的类型转换为左侧类型后赋值定义变量时要防止数据溢出实型→整型:直接取整,舍弃小数部分。整型→实型:数值不变,但要补足相应的有效位数。字符型→整型:将ASCII码值赋给最低的8位。整型→字符型:只截取最低的8位赋给字符型变量。

60说明:2.赋值与数学中的“等于”完全不同。例:intx=10;x=x+1在数学里x=x+1是矛盾的

。但在C语言中则合法(常用)。3.C语言中a=b和b=a含义不同。4.当赋值运算符左右类型不一致时,需要进行类型转换。通常由系统自动将右侧的类型转换为左侧类型后再赋值。例:inta;a=1.2;执行后,变量x的取值为11double类型执行后,变量a的取值为1613、赋值运算符复合的赋值运算符

在赋值符“=”之前加上其他运算符,如+=,-=,*=,/=,%=等。可以构成复合的运算符.

复合赋值运算符具有右结合性。

a+=3

等价于

a=a+3复合赋值运算符使用一般形式为:

<变量><双目运算符>=<表达式>等价于:

<变量>=<变量><双目运算符><表达式>//例如:n+=1 等价于n=n+1x*=y+1 等价于x=x*(y+1)k%=i+k 等价于k=k%(i+k)要加括号623、赋值运算符赋值表达式也可以包含复合的赋值运算符。

例:

a+=a-=a*a

求解步骤如下:(设置a的初值为12)①先进行“a-=a*a”的运算,它相当于:

a=a-a*a,a的值为12-144=-132。②再进行“a+=-132”的运算,相当于:

a=a+(-132),a的值为-132-132=-264。如果变成:

a+=a-=a*=a

结果又如何呢?634、关系运算符关系运算符及其优先次序<(小于)<=(小于或等于)>(大于)>=(大于或等于)==(等于)!=(不等于)优先级相同(6)优先级相同(7)说明:关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符644、关系运算符关系表达式用关系运算符将两个表达式起来的式子,称关系表达式。例:a>b,a+b>b+c,(a=3)>(b=5),’a’<‘b’,(a>b)>(b<c)关系表达式的值是一个逻辑值,即“真”或“假”。例:关系表达式”a>b”的值为“真”,表达式的值为1。C语言中没有专用的逻辑值,1代表真,0代表假654、关系运算符#include<stdio.h>voidmain(){

inta=1,b=2,c=3,d=4;/*声明变量a,b,c,d并初始化*/

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

printf("%d\n",a<=2*b);

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

printf("%d\n",a!=(c==d));} //结果为假,输出0//结果为真,输出1//结果为真,输出1//结果为真,输出1Printf(“%d\n”,a<b<c);

输出什么?有时判断的条件是一个复合的条件,如:是中国公民,且在18岁以上从左至右665、逻辑运算符逻辑运算符及其优先次序1、&&(逻辑与)相当于其他语言中的AND2、||(逻辑或)相当于其他语言中的OR3、!(逻辑非)相当于其他语言中的NOT例:a&&b

若a,b为真,则a&&b为真。

a||b

若a,b之一为真,则a||b为真。!a若a为真,则!a为假。优先次序:!(非)->&&(与)->||(或)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符67PQP&&QP||Q!P00001010111001011110逻辑运算真值表685、逻辑运算符//逻辑运算示例#include<stdio.h>voidmain(){

charch;

printf(“inputaletter:”);

scanf(“%c”,&ch); /*输入一个字母*/

if(!(ch>=’A’&&ch<=’Z’||ch>=’a’&&ch<=’z’))

printf(“inputerror!\n”);

/*如果输入的不是字母则提示错误*/}

不能改成:’A’<=ch<=’Z’

695、逻辑运算符逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式逻辑表达式的值应该是一个逻辑量“真”或“假”。例:设a=4,b=5:

!a的值为0a&&b的值为1

a||b的值为1!a||b的值为14&&0||2的值为1任何非零的数值被认作“真”,非零即为真70判断一个数x能否同时被2,3,7整除

x%2==0x%3==0x%7==0C表达式数学表达式(x≥5)且(y≠8)(x>=5)&&(y!=8)2<x<4或x>10

(x>2&&x<4)||(x>10)2<x<4需要同时满足只需要满足其中之一?进行%运算看余数是否为0(x%2==0)&&(x%3==0)&&(x%7==0)715、逻辑运算符例:5>3&&8<4-!0

自左向右运算

1&&0逻辑值为08<3逻辑值为04-1值为3!0逻辑值为15>3逻辑值为1表达式值为0725、逻辑运算符逻辑运算的“短路”特性:(1)a&&b&&c

只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。(2)a||b||c

只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c。73注意:&&和||在表达式中运算时有着特殊规定(“短路”特性)。例:设有inta=1,b=2,c=3,d=4,m=2,n=2;执行

(m=a>b)&&(n=c>d)后m的值为

,n的值为

。例:设intx=0,y=1,z;

执行

z=!x||--y;后z的值为

,x的值为

,y的值为

不计算不计算01严格按照结合性从左向右计算严格按照结合性从左向右计算02101746、逗号运算符逗号运算符:将两个表达式连接起来,又称为“顺序求值运算符”。

如:3+5,6+8

一般形式:

表达式1,表达式2…,表达式n求解过程:先求解表达式1,再求解表达式2,依次。整个逗号表达式的值是表达式n的值。756.逗号运算符表达式1,表达式2,…,表达式n整个逗号表达式的值从左至右依次计算每个子表达式逗号运算符优先级是最低的。结合方向从左至右。766、逗号运算符例:逗号表达式x=a=2*3,a*4,a+5;

分析:赋值运算符优先级高于逗号运算符,先计算子表达式x=a=2*3,a和x被赋值为6,再计算子表达式a*4,值为24,最后计算子表达式a+5,值为11,整个表达式的结果取子表达式a+5的值,即11。例:逗号表达式x=(a=2*3,a*4,a+5);

分析:先计算括号中的逗号表达式a=2*3,a*4,a+5,其中先计算子表达式a=2*3,a被赋值为6,再计算子表达式a*4,值为24,最后计算子表达式a+5,值为11,整个逗号表达式的结果取子表达式a+5的值11,再赋给x。77逗号运算示例#include<stdio.h>intmain(){

int

x,a;x=(a=2*3,a*4,a+5);

printf(“x=%d,a=%d\n”,x,a);return0;}程序运行结果为:x=11,a=6787、条件运算符条件运算符是三目运算符,由两个符号“?:”组成,需要3个运算对象。

一般形式:表达式1?表达式2:表达式3求解过程:若表达式1的值为真(非0),则执行表达式2,其结果作为整个条件表达式的值,否则执行表达式3,其结果作为整个条件表达式的值。797、条件运算符说明:(1).3个操作数可以是任意类型表达式。

(2).条件运算符优先级高于赋值运算符,低于关系运算符和算术运算符,位于第13优先级。

(3).条件运算符的结合方向为“自右至左”。

(4).“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。(5).如果表达式1为真,只计算表达式2,否则只计算表达式3。80条件运算符举例#include<stdio.h>intmain(){

inta=2,b=1,m=6,n=6,x;x=a>b?(m=0):(n=0);

printf("x=%d,m=%d,n=%d\n",x,m,n);return0;}817、条件运算符//输入两个数,求其中较大的数和较小的数。#include<stdio.h>voidmain(){int

a,b,max,min;

printf(“inputa=”);

scanf(“%d”,&a);/*输入变量a*/

printf(“inputb=”);

scanf(“%d”,&b);/*输入变量b*/max=a>b?a:b;min=a<b?a:b;

printf(“max=%d,min=%d\n”,max,min);

}

求a,b,c三个数的最大数m:

m=a>b?a:b>c?b:c;

()m=a>(b>c?b:c)?a:(b>c?b:c);828、位运算符

由于C语言可直接对硬件编程,在系统软件设计中要求能对位进行运算,因此,C语言提供了6种位运算符,支持位运算等汇编操作。运算符功能运算对象个数优先级结合方向~按位取反单目2从右至左<<左移位双目5从左至右>>右移位双目5从左至右&按位与双目8从左至右^按位异或双目9从左至右|按位或双目10从左至右838、位运算符

位逻辑运算符是以数据的二进制数位进行运算,位移动运算是按二进制位数进行左移和右移。(1)位逻辑运算ab~

a(按位取反)a&b(按位与)a|b(按位或)a^b(按位异或)110110100011011011001000848、位运算符1)按位取反按位取反,运算符为“~”。把该运算对象的每个二进制位取反。例如,~5,运算如下(只列出了最低的8个二进制位):~0000010111111010858、位运算符2)按位与按位与,运算符为“&”。常用来对某些二进制位清0或保留某些二进制位。在需要清0的位置上,将与它进行与运算的运算对象的对应的二进制位置0,需要保留原值的位置,则将对应的二进制位置1。例如,要保留155的最低3位不变,其余置0,可用155&7来实现,运算如下(只列出了最低的8个二进制位):10011011(155的二进制形式)&00000111(7的二进制形式)00000011(结果为3)868、位运算符3)按位或运算符为“|”。通常用来对某些二进制位置1或保留某些二进制位。在需要置1的位置上,将与它进行或运算的运算对象的对应的二进制位置1,需要保留原值的位置,则将对应的二进制位置0。例如,要保留129的最低3位不变,其余置1,可用129|248来实现,运算如下(只列出了最低的8个二进制位):10000001(129的二进制形式)|11111000(248的二进制形式)11111001(结果为249)878、位运算符4)按位异或按位异或,运算符为“^”。两个运算对象中对应的二进制位相同(都是1或都是0),则该位结果为0;不相同则结果为1。例如,155^129,运算如下(只列出了最低的8个二进制位):10011011(155的二进制形式)^10000001(129的二进制形式)00011010(结果为26)888、位运算符(2)位移动运算语法格式:运算数据位移动运算符移动位数①左移位,运算符为“<<”。把左边的运算数据的全部向左移指定的位数,高位丢弃,低位补0。例如,a的值为5,a<<2

把a的二进制位全部向左移动2位,

即00000101左移2位后为00010100(

相当于a乘以22。898、位运算符(2)位移动运算②右移位,运算符为“>>”。把左边的运算数据的全部向右移指定的位数,低位丢弃,对于正数,高位补0,负数的符号位为1,最高位补1还是补0取决于编译器,多数情况是补1。例如,a的值为15,a>>2

是把a的二进制位全部向右移动2位,即15的二进制00001111右移2位后为00000011(十进制数为3),相当于a除以22取整。909、其他运算符

sizeof()运算符,单目运算,第2优先级,结合方向是从右至左。一般形式:

sizeof(变量名|数据类型标识符|表达式)功能:计算该数据类型变量所占的字节数。例:

inta=5;floatx=3.2,y=6.4;

sizeof(a)

值为:4(在TURBOC中为2)

sizeof(char)

值为:1

sizeof(x+y)

值为:4

sizeof(double)

值为:8 912.3.2表达式表达式:用运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C表达式。运算对象包括常量、变量、函数等。其中,单个的常量、变量、函数也称为表达式。表达式运算后只会产生一个结果,该结果是具有某种数据类型的数值。C语言中,运算是自左向右的,运算符执行顺序通常由运算符的优先级和结合方向控制。优先级较高的运算符先于优先级较低的执行,如生活中常说的先乘除后加减。结合方向则控制具有相同优先级的多个运算符的执行顺序。922.3.3类型转换C语言提供了3种类型转换方式:自动转换、强制转换赋值转换。93说明:这种类型转换是由系统自动进行的。必定的转换转换的方向例如:3.27+201用double类型的加法运算1、自动转换(也称隐式类型转换)94例如:

inti=1;charch=‘A’;floatx=3.5f;doubley=7.8;表达式(i*ch)+(x/y)-(y-ch)的数据类型。intdoubledoubledoubledouble952.3.3类型转换例如,设folatx=7.5;则x%3显然不符合要求,因为只能对整型数据进行取余运算,所以需要用到强制类型转换,(int)x%3即7%3。2、强制类型转换(也称显式转换)

是用强制类型转换运算符将运算对象转换为需要的数据类型。

一般形式:

(目标类型说明符)(表达式)说明:表达式应该用括号括起来。在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。962.3.3类型转换3、赋值时的类型转换当左右类型不一致时,需要进行类型转换,将右边的类型转换为左边的类型,这种转换系统自动进行。实型数据→整型:直接取整,舍弃小数部分。字符型或整型数据→实型:数值不变,补足相应的有效位数。单精度实型→双精度实型:数值不变,有效位数扩展到16位,以8个字节存储;双精度实型赋值给单精度实型时,只截取前面7位有效数字,以4个字节存储。字符型→整型:将ASCII码值赋给最低的8位。整型→字符型:只截取最低的8位赋给字符型变量。972.3.3类型转换3、赋值时的类型转换

int或long类型数据→short类型变量:只截取最低的16位赋给short类型变量;short类型数据→

int或long类型变量:将数据直接赋给最低的16位,其余位按原short类型的最高位扩展,全部补0或全部补1。unsigned类型数据→长度相同的非unsigned类型变量时,直接传送数据;非unsigned类型数据→长度相同的unsigned类型变量时,连符号位一起作为数值进行数据赋值。982.4标准输入/输出(一)所谓输入输出是以计算机主机为主体而言的。输出:从计算机向外部输出设备(显示器,打印机)输出数据。输入:从输入设备(键盘,鼠标,扫描仪)向计算机输入数据。(二)C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。(三)在使用系统库函数时,要用预编译命令#include将有关的“头文件”包括到用户源文件中。

#include<stdio.h>或#include“stdio.h”992.4.1printf()函数

printf()函数称为格式化输出函数,它能够按用户指定的格式输出多种类型的数据。

一般格式为:

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

例如:printf(”i=%d,c=%c\n”,i,c);普通字符可以是常量、变量或表达式1002.4.1printf()函数printf函数的参数包括两部分:(1)“格式控制”是用双撇号括起来的字符串,也称

“转换控制字符串”。(2)“输出表列”是需要输出的一些数据,可以是

常量、变量或表达式。1012.4.1printf()函数

(1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括三种信息。①格式说明。格式说明由“%”和格式字符组成,如%d、%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。

②普通字符。普通字符即需要原样输出的字符。例如上面printf函数中双撇号内的逗号、空格。

③转义字符:无法用单个字符描述的一些特定操作,如\n(换行)、\t(跳到下一个水平制表位)等。1022.4.1printf()函数格式字符含义d以十进制形式输出带符号整数(默认正数不输出符号)o以八进制形式输出无符号整数(默认不输出前缀0)x或X以十六进制形式输出无符号整数(默认不输出前缀0x)u以十进制形式输出无符号整数f以小数形式输出单、双精度实数e或E以指数形式输出单、双精度实数g或G以%f或%e中输出宽度较短的形式输出单、双精度实数c输出单个字符s输出字符串1032.4.1printf()函数//printf()函数的使用示例。#include<stdio.h>voidmain(){charch=’a’;

printf("ch=%d,thecapital:%c\n",ch,ch-32);

}

运行结果:ch=97,thecapital:A1042.4.1printf()函数基本的格式字符有以下几种:⑴d格式符。按十进制整型数据的实际长度输出。

⑵i格式符。作用与d格式符相同,按十进制整型数据的实际长度输出。一般习惯用%d而少用%i。⑶c格式符。用来输出一个字符。

一个值在0~255范围内的整数,也可以用“%c”使之按字符形式输出。

1052.4.1printf()函数⑷s格式符,用来输出一个字符串。

例:

printf

(″%s″,″CHINA″);

输出字符串“CHINA”(不包括双引号)⑸f格式符。用来输出实数(包括单、双精度),以小数形式输出,不指定整个字段的长度,由系统自动指定。一般的处理方法是:整数部分全部输出,并输出6位小数。注意:在输出的数字中并非全部数字都是有效数字。单精度实数的有效位数一般为6-7位,双精度实数的有效位数一般为15-16位。1062.4.1printf()函数(6)e格式符,用格式说明%e指定以指数形式输出实数。例:printf(″%e″,123.456);输出如下

1.234560

e+0026列5列C编译系统自动指定给出数字部分的小数位数为6位,指数部分占5位。1072.4.1printf()函数完整的格式说明部分还可以加入一些修饰符,形式为:

%[标志][域宽][.精度][长度]格式字符(1)标志:可使用-、+、空格、#和0共5种标志字符

标志字符含义-结果左对齐,数据长度小于域宽时右边补充空格+输出符号(正号或负号)空格输出值为正数且没有输出正号时冠以空格#只对部分类型格式字符有影响;对o类,在输出时加前缀0;对x类,在输出时加前缀0x;对e,g,f

类当结果有小数时才显示出小数点0数据长度小于域宽时,不足位数用0补充1082.4.1printf()函数(2)域宽:指定数据显示在输出设备上所占的总宽度。若数据的实际位数多于指定宽度,则按实际位数输出;若实际位数少于指定宽度,则数据通常会在指定宽度内右对齐,不足部分以空格补齐。(3)精度:以“.”开头,其意义是:如果输出值为整数,则输出数字的最少个数,若位数少于指定精度,就在整数前面加0,补齐指定的最小数字个数;如果输出值为实数,则表示小数的位数,默认为6位;如果输出的是字符串,则只取字符串中左端n个字符。注意,若实际位数大于所定义的精度数,则截去超过的部分,对小数部分四舍五入。(4)长度:长度格式符为h,l两种,h表示按短整型输出,l表示按长整型输出。1092.4.1printf()函数//格式输出示例。{

inta=123;floatb=123.1234567;doublec=12345678.1234567;charch='f';

printf("a=%d,%8.5d,%08d,%o,%#x\n",a,a,a,a,a,a);printf("b=%f,%-10.3f,%e,%g\n",b,b,b,b);printf("c=%f,%8.4f,%g\n",c,c,c);

printf("ch=%c,%8c\n",ch,ch);printf("%s,%.4s\n","abcdef","abcdef");}

1102.4.1printf()函数注意:使用printf()函数时输出顺序是从左到右,但是输出列表中的各输出项的求值顺序,不同的编译器不一定相同,VisualC++是按从右到左进行的。printf()函数还可以只有格式控制字符串而没有输出项。

//输出项求值顺序示例{

inta=5;printf("a=%d,a=%d\n",a=a+1,a=a+2);}

运行结果:a=8,a=71112.4.2scanf()函数

scanf()函数称为格式化输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量中。一般格式为:

scanf(“格式控制字符串”,地址列表);

含义同printf函数可以是变量的地址,或字符串的首地址int

a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c);345↙a=3,b=4,c=51122.4.2scanf()函数格式字符串由%和格式字符组成,还可以加入一些可选项。一般形式为:

%[*][输入数据宽度][长度]格式字符(1)格式字符:指定输入数据的类型。格式字符含义(输入类型)d输入十进制整数o输入八进制整数(可以以0开头,也可以不以0开头)u输入无符号十进制整数x输入十六进制整数(可以以0x或0X开头,也可以不以此开头)f、e、g输入实数(用小数形式或指数形式,符号和小数部分可选)c输入单个字符(输入时不加单引号)s输入字符串(输入时不加双引号)1132.4.2scanf()函数(2)*:表示该输入项,读入后不赋予相应的变量,即跳过该输入值。例如:scanf("%d%*d%d",&a,&b);

当输入为:123时,把1赋予a,2被跳过,3赋予b。(3)输入宽度:用十进制整数指定输入的宽度(即字符数)。例如:scanf("%5d",&a);

输入:12345678只截取前5位12345赋予变量a。又如:scanf("%4d%4d",&a,&b);

输入:12345678将把1234赋予a,而5678赋予b。(4)长度:长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度实型数(如%lf)。h表示输入短整型数据。1142.4.2scanf()函数使用scanf()函数容易与printf()函数混淆,注意

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论