第2章 C语言基本数据类型、运算符和表达式
本章知识要点及考核要求
C语言的基本数据类型(整型、浮点型、字符型)及其表示方法;常量与变量的使用;运算符的种类、运算优先级和结合性;常用表达式(赋值表达式、算术表达式、关系表达式、逻辑表达式、条件表达式、逗号表达式)的语法表示及其求值规则;不同类型数据间的转换与运算。位运算符(&、1、^、~、<<、>>)及其运算。
1.基本要求
(1)掌握C语言的基本数据类型,了解不同数据类型常量的表示方法。
(2)掌握变量的定义、初始化和引用的基本方法。
(3)在编程中会根据需要合理确定常量与变量的类型并正确使用。
(4)理解各种运算符的优先级和结合性,掌握其构成表达式的语法表示和运算规则,会正确计算表达式的值,会根据需要书写正确的 C表达式。
5)了解表达式中不同类型数据间的自动转换规则,掌握强制类型转换的使用方法。
(6)理解各种位运算符的含义,掌握各种位运算的运算规则和特点。会正确分析简单的位运算程序,会正确使用位运算实现清零、置 1、保留、移位等功能。
2.重点、难点
重点:基本数据类型、常量、变量及各种运算符。
难点:运算符的优先级和结合性。
一、数据类型
算法处理的对象是数据,而数据是以某种形式存在的。所谓数据结构是指数据的组织形式。因此,考虑算法时,必须注意数据结构。
程序=数据结构+算法 【数据的描述规则】【数据的操作规则】
C语言的数据结构是以数据类型的形式出现的。C的数据类型如下:
为什么要规定数据类型
不同的数据类型在内存中占用不同大小的存储单元
不同的数据类型所表示的数据取值范围不同
不同的数据类型可以参与的运算种类也不相同
便于在程序中按不同的方式和要求进行处理
二、常量、变量、运算符及表达式
(一)标识符
1、定义:用来标识变量、常量、函数、等的字符序列(符号化的名字)
2、组成:字母,数字,下划线的组合
开头:字母,下划线的;
(2)C语言的关键字不能用作标识符,C语言中有32个关键字(保留字)。12个预处理命令。
1)在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序统称为标识符,下列选项中都为正确标识符的是(C)。
A. M.D.John, _abc
B.3sum, a123
C._total, abc321
D.$123, bb$
2)下列选项中,合法的C语言标识符是(A )
A_123456789
B OxFF
C extern
D #a
(二)常量
程序运行时其值不能改变的量
1、整型常量:
10、15L、 010、 OX3D、25U
(1)三种表示形式:
八进制、十进制、十六进制
(2)后缀:
L或1长整型 u或U 无符号整型
(3)存储:
补码
C与严重没有二进制书写形式
2、实型常量:
也称浮点数或实数
(1)十进制形式:
8,14,-78,96 ,12
(2)指数形式:
1.23E-2 43.5e+4
注意: e前e后需有数,e后必为整数
3、字符常量:
用单引号括起来的单个普通字符或转义字符。
‘A’、‘b'、’c‘、’ n'、‘\101’
(1)可视字符常量
(2)转义字符
无法从键盘输入或者另有他用
a、以反斜线(\)开头,放在一对单引号内:
'\n'表示换行、'\\' 表示反斜线....
b、转义字符表示一个字符,占用一个字节
(3)存储
字符常量占用一个字节长度,存储该字符的ASCII码值
(4)整型与字符型在[0,255]范围通用
已知int a=2,b=1;则语句printf("a\b");输出的是 A
A.a\b
B.2
C.2\1
D.空
字符串原模原样输出
#include "stdio.h"
int main (){
int a=2,b=1;
printf("a\b");
};
4、字符串常量:
用双引号( "" )括起来的字符序列。
"如: "sum"、 "A"、"123"
存储:每个字符串尾自动加一个'\0'作为字符串结束标志
#include "stdio.h"
int main (){
printf("字符串原模原样输出");
};
注意:字符常量与字符串常量不同
'A' 01000001 占用一个字节
"A" 01000001 00000000 占用两个字节
#include "stdio.h"
int main (){
char s;
s = 'A';
printf("字符常量A的值是%d \n",s);
printf("字符串常量A");
};
字符常量A的值是65
字符串常量A
5符号常量(宏定义):
用标识符来代表常量(标识符形式的常量)。
如: #define PI 3.14
例:以下合法的常量表达式是(A)
Α.'\0' 字符串自动结束符
B.018 八进制数值超出
C.5E3.5 E后需要有整数
D.'loveC' 符号应该用" "
(三)变量:其值可以改变的量
存输入数据,中间结果,最终结果
1、变量
代表内存中具有特定属性的一个存储单元,它用来存放数据,也就是变量的值,在程序运行期间,这些值是可以改变的。
2、定义格式:
【先定义后使用】
[存储类型] 数据类型 变量名1,变量名2
3、变量类型
1) 整型变量(int【默认类型】、long、 short,unsigned)
2)实型变量(float, double【默认类型】)
3)字符变量(char)
4、变量初始化:定义变量时赋初值
#include "stdio.h"
int main (){
int a=3; #变量的定义 并且对变量进行赋值
float b=5.3; #变量的定义 并且对变量进行赋
};
例:下列对于变量的定义,哪个是非法的(D)。
A. char ch1, ch2;
B.float x,y;
C. int c,d; double x1,x2;
D. int a,b; double x,y,b;
变量名不能重复
变量定义就是申请数据的存储空间,登记数据的各种存储特性。
整型数据可以和字符型数据通用
(四)各种类型数据混合运算
在不同类型数据之间运算时会发生自动类型转换(包括赋值)
(五)运算符和表达式
C语言一共有34个运算符,记这些运算符时从以下三方面记:
运算符的书写形式;
运算符的运算规则;
优先级和结合性;
a+b*c 考虑结合性
a+b-c 结合方向(左结合,右结合)
1、算术运算符: + - * / %【加减乘除 求余】
说明:(1)两个整数相除的结果为整数。
#include <stdio.h>
int main () {
int a = 5, b = 4, c;
c = a / b;
printf("%d",c);
return 0;
};
整数 5/4的结果是1,不会出现余数
#include <stdio.h>
int main () {
float a = 1.0, b = 2, c;
c = a / b;
printf("%d",c);
return 0;
};
小数类型相除结果就是小数 0.5
(2)%要求参加运算的运算对象为整数结果也是整数。
#include <stdio.h>
int main () {
int a = 8, b = 3, c;
c = a%b;
printf("%d",c);
return 0;
};
结果为2
(3)*不能省略
在数学中可以2a ,在c语言中不可以直接写需要写成2*a
(4)优先级与结合性:同数学一样,可加括号改变。
2.强制类型转换运算符
(类型名)表达式
注意:(float) 22/5 与(float) (22/5)不同
#include <stdio.h>
int main () {
float a=(3.5)+4;
printf("%f",a);
return 0;
};
在这种情况下,程序正常运行的结果是 7.5
#include <stdio.h>
int main () {
float a=(int)(3.5)+4;
printf("%f",a);
return 0;
};
经过强制类型转换后的程序 执行结果为7.0
#include <stdio.h>
int main () {
int a=(float)22/5;
printf("%d",a);
return 0;
};
#结果4.4
#include <stdio.h>
int main () {
int a=(float)(22/5);
printf("%d",a);
return 0;
};
#结果4.0
/*(float) 22/5 和 (float) (22/5) 的区别在于括号的使用位置。
(float) 22/5 先将22转换为浮点数,然后再与5相除。这会得到一个浮点数结果。
(float) (22/5) 先计算括号内的整数除法操作,得到4,然后将其转换为浮点数。最终得到的结果也是一个浮点数。
让我们具体计算一下:
对于 (float) 22/5:
(float) 22 得到浮点数 22.0
22.0 / 5 得到浮点数 4.4
对于 (float) (22/5):
22/5 得到整数 4
(float) 4 得到浮点数 4.0
所以最终结果分别是 4.4 和 4.0。*/
例:已知int n; float f=2.8;则执行n=(int)f%3后,n的值是(D)A.2.8 B.0 C.1 D.2
#include <stdio.h>
int main () {
int n;
float f=2.8;
n=(int)f%3;
printf("%d",n);
return 0;
};
#在执行 n = (int)f % 3 这个操作时,首先将浮点数 f 强制转换为整数,然后再取余数。所以,首先要注意强制转换会丢失小数部分。然后,计算余数时,得到整数除法的余数。
强制转换 (int)f 会将 2.8 转换为 2,丢失了小数部分。
然后计算 2 % 3,这是整数除法的余数,因为 2 不能整除 3,所以余数为 2。
所以,最终 n 的值是 2,答案是 D.2。
3.赋值运算符及表达式
1、简单赋值运算符
= 赋值号
变量名=表达式 将表达式的值放到变量名中
(1)运算规则
(2)右结合
#include <stdio.h>
int main () {
int x;
x=3;
int y,z;
x=(y=(z=3));
printf("%d",x);
return 0;
};
#等价
#include <stdio.h>
int main () {
int x;
x=3;
int y,z;
x=y=z=3;
printf("%d",x);
return 0;
};
(3)左侧必须是变量,不能是常量
喜新厌旧是变量的一个特性
2、复合赋值:
a+=表达式 等价于 a=a+表达式
a-=a+b 等价于 a=a-(a+b)
思考题:a=3; a+=a-=a*a;
#include <stdio.h>
int main () {
int a;
a=3;a+=a-=a*a;
printf("%d",a);
return 0;
};
#a = 3;
在这一步,将a的值设为3。
a += a -= a * a;
在这一步,我们需要注意赋值运算符的优先级。首先计算右侧的 a -= a * a。
a * a = 3 * 3 = 9
a -= 9 等价于 a = a - 9
因此,现在a的值为 -6(3 - 9 = -6)。
然后,继续计算左侧的 a += -6。
a += -6 等价于 a = a + (-6)
a = -6 + (-6) = -12
最终,a的值为 -12。
所以,表达式的结果是:a = -12。
a=3; a+=a-=a+=a;
#include <stdio.h>
int main () {
int a;
a=3;a+=a-=a+=a;
printf("%d",a);
return 0;
};
#a = 3;
在这一步,将a的值设为3。
a += a -= a += a;
现在,我们需要注意赋值运算符的优先级。
首先,计算右侧的 a += a。这等价于 a = a + a,也就是2倍的a。
所以,a = 3 + 3 = 6。
然后,继续计算左侧的 a -= 6。这等价于 a = a - 6。
a = 6 - 6 = 0。
最终,a的值为0。
所以,表达式的结果是:a = 0。
3、赋值运算的类型转换
赋值运算符两侧的数据类型不一致时,赋值运算符右端的表达式计算结果要转换为赋值运算符左端变量的类型。