C程序设计学习笔记2

第二章 数据类型与表达式

2.1 数据类型
利用计算机求解问题,首先需要把实际问题的数据引入到计算机中,即在程序中描述这些数据。程序设计语言通过数据类型来描述不同的数据形式,类型是所有程序的基础,它代表着数据的含义和可以对数据所进行的操作。
求解问题的基本处理是运算。通过C语言丰富的运算符及其表达式构成实现算法的基本步骤。
C语言内置数据类型有基本类型、构造类型、指针类型。
基本类型有:整型、浮点型、字符型、空类型
构造类型有:数组类型、结构体类型、共用体类型、枚举类型
可以由这些内置数据类型构造出自定义数据类型。
C语言的数据包括变量与常量,变量与常量都是有类型的。C语言没有统一规定各个数据类型的内存长度、数值范围、和精度,这些由编译器自己决定。
2.1.1 整型
C语言的整型分为短整型(short)、基本整型(int)、长整型(long),int型的数据的内存长度通常为机器的一个字长。
整形数据的存储形式为二进制补码形式。
整型还分有符号(signed(可省略))和无符号(unsigned),两种类型表示的范围不一样。
选用的数据类型不合适,可能发生数据的溢出。
2.1.2 浮点型
浮点型分为单精度、双精度,长双精度。
浮点型在内存中的存储形式是IEEE754标准,一般多采用double型。
例2.1 浮点型数据的误差

#include<stdio.h>

int main()
{
	float a=0.00000678f,b=0.00000123f;
	double c=0.00000678,d=0.00000123;
	double e=100000000000000000000.0;
	a=a+111111.111f;
	b=b+111111.111f;
	c=c+111111.111;
	d=d+111111.111;
	e=e+111111.111f;
	printf("a=%.16f,b=%.16f\n",a,b);
	printf("c=%.16f,d=%.16f\n",c,d);
	printf("e=%lf\n",e);
	return 0;
}

2.1.3 字符型
C语言字符型分为有符号(signed char(signed可省略))和无符号型(undigned),字符型数据在内存中占用一个字节,采用二进制存储。
字符型数据可以存储整型数据,但是范围小。字符型数据还可以存储单字节字符,如ASC码,此时在内存中的数据是字符的ASC码值。
C语言中字符型数据可以和整型数据通用,一个字符数据可以赋值给一个整型变量,此时是字符的ASC码值,一个整形数据可以赋值给一个字符型变量,此时是这个整型数据对应的字符。还可以对字符型数据进行算术运算。
通常,单字节字符或者小范围的整型,可以用字符型来代替。
例2.2 字符型数据与整形数据的赋值与运算

#include<stdio,h>

int main()
{
	int i,j;
	char c1,c2;
	i='A';
	j=66;
	c1='a';
	c2=98;
	printf("i=%d,j=%d,c1=%c,c2=%c\n",i,j,c1,c2);
	printf("c1-32=%c\n",c1-32);
	return 0;
}

2.2 常量
常量是指在程序中其值不能被修改的数据,分为字面常量和符号常量。
每个字面常量有自己的数据类型。
2.2.1 整型常量
一个整型常量可以用三种方式表示:
(1)十进制整数
(2)八进制整数(以0开头和0-7组成的整数)
(3)十六进制整数(以0x开头和十六进制数组成的整数)
整型变量的数据类型区分
默认为signed int 型
168u:unsigned型
-1L:long 型
2.2.2 浮点型常量
浮点型常量有两种表示形式:
(1)小数形式
(2)科学计数法
浮点型常量默认为double型。
3.1415926F:float型
3.1415926L:long double型
2.2.3 字符常量
一个字符常量可以用3种不同的方式来表示
(1)用字面常量来表示
以一对单引号‘’括起来的的一个字符表示字符常量,字符常量表示的是一个字符,存储的是该字符的ASC码,如‘A’,数据值是65.单引号是边界符,这种只能包含一个字符。注意区分字符’2‘和整数2.
(2)用转义字符来表示
转义字符:以反斜线(\)开头,后面跟着一个或几个字符序列表示的字符称为转义字符,如\n表示换行符。采用转义字符可以表示出ASC字符集中不可打印或者不方便输入的控制字符和其他特定功能的字符。
\

"
(3)用ASC码来表示
由于字符型数据与整形数据是通用的,因此可以用字符的码值来表示字符。
例如’A‘可以表示成65或者0101或者0x41.
例2.3转义字符的使用

#include<stdio.h>

int main()
{
	printf("ab c\t de\rf\tg\n");
	printf("h\ti\b\bj k\n123\'\"\\\x41\102cde\n");
	return 0;
}

2.2.4 字符串常量
以一对双引号(“”)括起来的零个或多个字符组成的字符序列称为字符串常量,ASC字符集或多字节字符集(如汉字,韩文)都可以组成字符串常量。双引号是字符串常量的边界符,如果在字符串常量中出现双引号需要使用转义字符。
字符串常量是数组的一种常量形式,与字符常量不同,表现在:
(1):边界符不同
(2):字符数不同,字符型常量有且只有一个字节,字符串常量至少有一个字节,(总有一个\0字符来表示字符串的结束)。
字符串常量不能在左右引号之间换行,C语言只允许将两个相邻的仅由空格、tab或换行符分开的字符串常量连接成一个字符串常量。

printf("kang” “zhuo"	"love"
"han hui yang");

printf("kang zhuo love han hui yang");

完全相同
2.2.5 符号常量
为了编程和阅读的方便,C程序中常用一个符号名称来代替一个常量,称为符号常量,即以标识符形式出现的常量,符号常量本质上是预处理命令,定义形式为:#define 标识符 常量
#define 是宏定义命令,作用是将标识符定义为常量值,在程序中所有出现该标识符的地方用常量代替。
例2.4 编程求圆的周长和面积

#include<stdio.h>
#define PI 3.1415926
int main()
{
	double r=5.0;
	printf("L=%lf,S=%lf",2*PI*r,PI*r*r);
	return o;
}

2.3 变量
2.3.1 变量的概念
变量:在程序运行期间其值可以改变的量称为变量。
变量实际上是计算机中的一个内存单元,这个内存单元需要明确它在哪儿,以及它多大,C语言规定变量应该有一个名字,用变量名来代替内存单元,通过变量名来找到相应的内存单元,定义变量即是分配内存单元,将之相关联,此后通过变量名来使用内存单元。
C语言通过定义变量时来指定其数据类型来确定其内存单元的大小。
变量还有地址、作用域、和生命周期等属性。
2.3.2 定义变量
C语言定义变量必须先先定义后使用,定义的一般形式为:
变量类型 变量名列表;
变量类型可以是基本类型、指针类型以及用户自定义类型。
变量名列表中各变量之间用,隔开,最后以;结尾,变量名命名要符合标识符规则。
变量定义要在执行语句之前,一个作用域内变量名不能重复
变量=对象
2.3.3 使用变量
变量使用之前要先初始化或者赋值
初始化:
变量类型 变量名=初值;
赋值:
定义之后
变量名=表达式;
2.3.4 存储类别
在变量定义时可以使用存储类别修饰符来限定变量的存储类别
auto int i;默认为自动变量
static int i;静态变量
register int i;寄存器变量
2.3.5 类型限定
在变量定义时可以用const和volatile修饰来限定变量
const限定
在变量定义之前加上const修饰,这样的变量称为只读变量或者常变量,它在程序运行期间不能修改。
const 变量类型 变量名列表;
本质上只读变量任然是变量,只是为了避免程序员不经意的对重要数据进行修改。
volatile限定
在变量定义之前加上volatile修饰,这样的变量称为隐式存取变量,它表示变量在运行期间会隐式的被修改。
volatile 变量类型 变量名列表;
2.4 运算符与表达式
2.4.1 运算符与表达式的概念
运算符描述对运算对象执行的操作,按功能分为算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、成员运算符和指针运算符。
运算符连接的运算对象的数目称为运算符的目,C语言运算符的目有三种。
单目运算符
双目运算符
三目运算符(只有一个,即条件运算符:expr1?expr2:expr3)
运算符具有优先级
运算符具有方向
运算符对数据对象的类型有要求
表达式
表达式是由运算符和运算对象组成的式子
注意运算对象
注意表达式求解步骤
注意表达式是否需要进行类型转换
注意表达式的结果是否有确定的值以及确定的数据类型
2.4.2 算术运算符
单目运算符:
(+) 取正值 +expr
(-) 取负值 -expr
双目运算符
(+) 加
(-) 减
() 乘
(/) 除
(%) 整数取余、取模运算(要求两个都是整数)
2.4.3 自增自减运算符
单目运算符
(++) 前置自增
(–) 前置自减
(++) 后置自增
(–) 后置自减
后置的优先级比前置的高
前置自增自减是先运算后使用
后置自增自减是先使用后运算
2.4.4 关系运算符
双目运算符
(<) 小于
(<=) 小于等于
(>) 大于
(>=) 大于等于
(==) 相等比较
(!=) 不等比较
比较结果:真为1假为0
2.4.5 逻辑运算符
(!) 逻辑非
(&&) 逻辑与
(||) 逻辑或
逻辑非的优先级最高
逻辑或的优先级最低
逻辑非的优先级高于算术运算符
逻辑与和逻辑或的优先级低于算术运算符和关系运算符
要特别注意逻辑运算符很有可能会发生短路的现象!!!
2.4.6 条件运算符
expr1?expr2:exor3
先计算expr1的值,如果为真,则执行expr2;如果为假则执行expr3
2.4.7 位运算符
位运算符是数据以二进制形式进行的运算,C语言提供的位运算符有6个:
(~): 按位取反
(<<): 按位左移
(>>): 按位右移
(&): 按位与
(^): 按位异或
(|): 按位异或
位运算符中,按位取反的优先级最高,按位左移按位右移的优先级其次,由于是按二进制位运算,所以一般采用无符号整型,如字节型。
按位与可以执行的操作有:指定的二进制位清零、取整数的制定二进制位、保留二进制位
按位或可以进行运算有:常用来设置一个整数中指定的二进制位为1.
按位异或:相异为1,相同为0.
按位异或可以进行的操作有:使得指定位翻转、将两个值互换。
按位取反是单目运算符,将所有位按位取反
左移运算符:
expr1<<expr2是指将expr1的所有二进制位向左移动expr2位,左边expr1位被移除,右边expr2位补0,左移一位相当于乘于2,仅针对无符号类型,乘于2的n次方的运算相当于左移n位。
右移运算符(expr1>>expr2)的作用是将expr1的所有位向右移动expr2位,右边expr2位被移除,左边expr2位补0.右移一位相当于除以2,除以2的n次方可以用右移n位来代替。
2.4.8 赋值运算符
(=)
(+=、-=、
=、/=、%=、&=、|=、<<=、>>=)
2.4.9 取长度运算符
sizeof(expr)
2.4.10 逗号运算符
(,)优先级所有运算符中最低,起到连接作用
2.4.11 圆括号运算符
()优先级所有中最高
2.4.12 常量表达式
常量和const变量和运算符组成的式子。
2.5 类型转换
2.5.1 隐式类型转换
隐式转换又称自动转换,转换按照“存储空间提升”的原则进行
2.5.2 显式类型转换
不能进行隐式类型转换时或在程序中要指定数据类型时,就要利用显式类型转换运算符进行强制转换。
显式类型转换运算符:(type)为单目运算符,用法(type)expr。
要注意运算对象的起止
要注意显示类型转换的目的是人为进行类型转换,使得不同数据类型的之间的运算进行下去,显示类型运算会产生一个指定类型的临时数据对象继续参与运算,但原有的数据类型和数据值并不会被改变。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pekingkenny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值