第二章:C语言数据类型和变量
目录
数据类型的介绍
signed和unsigned
数据类型的取值范围
变量
算数操作符 + - * / %
赋值操作符 =
单目操作符 ++ – + -
强制类型转换
scanf和printf的介绍
数据类型
C语言提供了丰富的数据类型来描述生活中的各种数据
使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作 数据
数据类型整体分为内置类型和自定义类型
内置类型分为:字符类型,整形,浮点型,布尔类型
自定义类型分为:数组,结构体,枚举,联合
char 字符类型
字符类型 分为有符号的无符号的
char 有符号的,unsigned char 是无符号的字符类型
int 整形
整形可以衍生出来 short int long long long 其中long long 是C99中引入的
float 浮点型
float double long double 其中long double 是C99中引入的
bool 布尔类型
C语言原来并没有为布尔值单独设置⼀个类型,而是使用整数0表示假的,非0表示真的
在C99中也引入了布尔类型,是专门表示真假 _Bool
使用的头文件是#include<stdbool.h>
# include <stdio.h>
int main ( )
{
int a = 0 ;
if ( a)
printf ( "ok\n" ) ;
else
printf ( "aaa\n" ) ;
return 0 ;
}
# include <stdio.h>
# include <stdbool.h>
int main ( )
{
_Bool flag = true;
if ( flag)
printf ( "ok" ) ;
else
printf ( "aaa\n" ) ;
return 0 ;
}
# include <stdio.h>
# include <stdbool.h>
int main ( )
{
bool flag = true;
if ( flag)
printf ( "ok" ) ;
else
printf ( "aaa\n" ) ;
return 0 ;
}
各种数据类型的长度
每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度度不同的变量,变量⻓度的不同,存储的数据范围就有所差异
char —1
short —2
int —4
long //长整型 —4/8
long long //更长的整形 —8
float —4
double —8
注意,C语言里面没有字符串类型,为什么要有这么多的数据类型:为了更加丰富的表达生活中的各种值
sizeof操作符
sizeof 是⼀个关键字,也是操作符专门是用来计算sizeof的操作符数的类型长度的,单位是字节
# include <stdio.h>
int main ( )
{
printf ( "%zd\n" , sizeof ( int ) ) ;
printf ( "%zd\n" , sizeof ( char ) ) ;
printf ( "%zd\n" , sizeof ( short ) ) ;
printf ( "%zd\n" , sizeof ( long ) ) ;
printf ( "%zd\n" , sizeof ( long long ) ) ;
printf ( "%zd\n" , sizeof ( float ) ) ;
printf ( "%zd\n" , sizeof ( double ) ) ;
return 0 ;
}
sizeof 操作符的操作数可以是类型,也可是变量或者表达式
sizeof的返回值是size_t类型的, 这种值打印用的格式控制符是%zd
# include <stdio.h>
int main ( )
{
int a = 10 ;
printf ( "%zd" , sizeof ( int ) ) ;
printf ( "\n" ) ;
printf ( "%zd\n" , sizeof ( a) ) ;
return 0 ;
}
sizeof 变量可以不加括号,但是sizeof类型是一定要加括号的
# include <stdio.h>
int main ( )
{
int a = 10 ;
printf ( "%zd" , sizeof ( a) ) ;
printf ( "\n" ) ;
printf ( "%zd" , sizeof a) ;
printf ( "%zd\n" , sizeof ( int ) ) ;
printf ( "%zd\n" , sizeof int ) ;
printf ( "\n" ) ;
return 0 ;
}
sizeof中表达式不计算,下面两个printf打印出来的结果都是2
sizeof 在代码进行编译的时候,就根据表达式的类型确定了结果的大小,而表达式的计算却要在程序运行期间才能执⾏,在编译期间已经将sizeof处理掉了,所以在运行期间就不会执行表达式了
# include <stdio.h>
int main ( )
{
int a = 10 ;
short s = 5 ;
printf ( "%zd\n" , sizeof ( s) ) ;
printf ( "%zd\n" , sizeof ( s= a+ 2 ) ) ;
return 0 ;
}
signed和unsigned
C语言使用signed 和unsigned 关键字修饰字符型和整型类型的
signed关键字,表示⼀个类型带有正负号,包含负值
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。
对于int类型,默认是带有正负号的,也就是说由于这是默 认情况,关键字int等同于signed int
# include <stdio.h>
int main ( )
{
int a = 10 ;
signed int a2 = 10 ;
printf ( "%d\n" , a) ;
printf ( "%d\n" , a2) ;
return 0 ;
}
int所占四个字节的第一个字节的第一个比特位表示的的是符号位,0表示正,1表示负
整数变量声明为unsigned 的好处是,同样长度的内存能够表示的最⼤整数值,增⼤了⼀倍,⽐如,16位的 signed short int 的取值范围是:-32768到32767,而unsigned short int 的取值范围是:0~65535
32位的int 的取值范围可以参看limits.h 中给出的定义
虽然说int 等于signed int ,但是char不一定等同于signed char,到底是有符号还是无符号根据编译器的不同有所不同,不过大多数情况下其实就是signed char
既然我们已经说了有符号和无符号,那么我们其实还需要注意的一点就是有符号和无符号的格式控制符一定要匹配使用,不然就会有想不到的事情发生
# include <stdio.h>
int main ( )
{
int a = 10 ;
printf ( "%d\n" , a) ;
signed int a2 = - 10 ;
printf ( "%d\n" , a2) ;
return 0 ;
}
# include <stdio.h>
int main ( )
{
int a = 10 ;
printf ( "%d\n" , a) ;
signed int a2 = - 10 ;
printf ( "%u\n" , a2) ;
return 0 ;
}
数据类型的取值范围
变量
上面说了类型,类型是用来干嘛的呢,类型其实就是用来创建变量的
生活中的有些值是不变的,有些值是可变的
不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示
全局变量不给初始化的话,就会默认他的值是0。局部变量不初始化的话,那么他的值就是随机值
变量在创建的时候就给⼀个初始值,就叫初始化
# include <stdio.h>
int main ( )
{
char ch = 'w' ;
short age = 10 ;
float weight = 55.5 ;
}
变量的分类
局部变量:在⼤括号内部定义的变量就是局部变量,局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的
全局变量:在⼤括号外部定义的变量就是全局变量,全局变量的使用范围更⼴,整个工程中想使⽤,都是有办法使用的
# include <stdio.h>
int a = 100 ;
int main ( )
{
int b = 10 ;
printf ( "%d\n" , a) ;
printf ( "%d\n" , b) ;
return 0 ;
}
# include <stdio.h>
int a = 100 ;
int main ( )
{
int a = 10 ;
printf ( "%d\n" , a) ;
return 0 ;
}
变量的使用
# include <stdio.h>
int main ( )
{
int a = 0 ;
int b = 0 ;
int c = 0 ;
( void ) scanf ( "%d %d" , & a, & b) ;
c = a + b;
printf ( "%d " , c) ;
return 0 ;
}
变量的作用域和生命周期
作用域
作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的。而限定这个名字的可用性的代码范围就是这个名字的作用域。局部变量的作用域是变量所在的局部范围。全局变量的作用域是整个工程
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。全局变量的生命周期是:整个程序的生命周期。
# include <stdio.h>
int main ( )
{
int num = 10 ;
printf ( "%d" , num) ;
return 0 ;
}
# include <stdio.h>
int main ( )
{
{
int num = 10 ;
}
printf ( "%d" , num) ;
return 0 ;
}
存储位置