标准输出
屏幕和终端就是常用的输出设备,把数据输出到屏幕和终端被称为标准输出。
格式控制字符
%d %md %ld %u %lu:十进制整型输出 %md m 表示需要多少个字符空位,如果比实际的小则按实际输出,如果比实际大则用空格填补;
%o 八进制整型输出
%x %X %#x %#X 十六进制:%x %X 表示使用小写或大写的16进制输出;%#x %#X 表示使用使用小写或大写的16进制输出并加上前缀0x或0X;
%c 字符
%s 字符串
%f %mf %m.nf 单精度浮点数输出 m控制需要多少个字符位置,.n小数点后保留的个数(四舍五入);
%lf 双精度浮点数
%Lf 长双精度浮点数
%p 地址
/* 测试格式控制字符 */
int p;
long double a = 8888.8888;
printf("%d
", 123);
printf("%8d
", 123);
printf("%f
", 100.005);
printf("%2f
", 100.005);
printf("%2.2f
", 100.005);
printf("%lf
",100.005);
printf("%Lf
", a);
printf("%c
", 65);
printf("%c
", 'a');
printf("%s
", "dinghai");
printf("%x
", 0x65);
printf("%x
", 65);
printf("%X
", 65);
printf("%#x
",65);
printf("%#X
", 65);
printf("%p
", &p);
数据类型
整型
用来存放一个没有小数部分的数据类型;
int a = 123; //开辟一个内存叫a,根据变量类型来分配内存大小
short 短整形,用来修改整型使之取值范围缩小,减小内存的开支
long 长整形 , 用来修改整型使之取值范围增大,增加内存的开支(64位系统8字节)
long long 长长整整, 用来修改整型使之取值范围增大,增加内存的开支(64位系统8字节)
unsigned 无符号 , 用来修改整型使之取值范围不涉及负数,取值范围4,294,967,295 --0
/*测试整型和浮点型所占的字节大小*/
printf("short int: %ld
", sizeof(short int));
printf("int: %ld
", sizeof(int));
printf("long int: %ld
", sizeof(long int));
printf("long long int: %ld
", sizeof(long long int));
printf("float: %ld
", sizeof(float));
printf("doule: %ld
", sizeof(double));
printf("long double: %ld
", sizeof(long double));
注意:1.当我们整型数超出最大值后,会变成相邻的最小值。
/*有符号整型溢出一个值,会从最小的值重新开始计数*/
int b = 2147483647;
printf("b:%d
", b);
printf("b:%d
", b+1);
C语言标准中并没有规定int 所占的空间大小。只有规定他们相互之间的关系:
short 不可以比 int 长
long 不可以比 int 短
long 的大小等于系统字长
系统字长: CPU一次性可以处理的数据的长度, 称为系统字长,比如 32位/64位
uname -a ;直接使用sizeof 来打印long 的大小 。
典型的尺寸:
char 占 1字节
short 占 2字节
int 占 4字节
long 占 4/8字节(具体看系统是多少位)
long long 占用8字节 (32/64位)
注意:
同样的代码在不同的系统中有可能出现数据尺寸不同的问题导致代码出现逻辑错误甚至无法正常运行。
浮点型
用来表达一个实数的数据类型。
单精度 float 占用4字节 (64位)10的-37次方 --- 10的38次方
双精度 double 占用8字节 (64位)10的308次方
长双进度 long double 占用16字节 (64位) 10的4932
以32位浮点数为例,其内部的存储结构是这样表示的:
符号域 指数域 小数域
| 1位 | 8位 | 23位 |
字符串
分为指针和数组两种定义方式
char * s1 = "Hello Even" ; // 使用指针来指向一个字符串(存储在只读段)只读不可修改
char s2[] = "Hello Gz2075" ; //系统把字符串放入了,开辟好内存的数组中,可以进行修改
注意:
1.在内存中字符串实际上是多个单独的字符组合而成;
2.每一个字符串后面都会有一个结束符 ' ',在操作字符串时,经常需要通过' '来判断是否结束操作;
3.在操作字符串完毕后要注意结尾是否有' ',没有则需要加上;
4.用指针的形式来表示字符串需要注意该指针指向的内存是否可读(一般如s1所表示的字符串是不接受修改)。
布尔类型
该类型只能用来表达0和非0,所占大小为1字节。在逻辑判断中非0即真。使用时需要添加头文件<stdbool.h>
常量
内存中不可以被修改的数据被称为常量,可以修改的数据称为变量。
int a = 100 ; // a 是变量 100是常量
float f = 123.456 // f 是变量 123.456 是常量
char s[] = "Hello Gz2075" ; // s 是变量 , "Hello Gz2075"是常量
常量类型:
100 整型常量
100L 长整型常量
100LL 长长整型常量
100UL 无符号的长整形常量
3.14 双精度浮点常量
3.14L 长双精度浮点常量
‘a’ 字符型常量
“abc” 字符指针型的常量
标准输入
从系统提供的标准输入设备如键盘,中读取数据就被称为标准输入。
scanf () ; // 格式化输入函数
头文件:
#include <stdio.h>
函数原型:
int scanf(const char *format, ...);
参数分析:
format --> 格式化控制字符串
返回值:
成功 返回输入成功的次数
失败 0
fgets() ; //字符串输入函数
头文件:
#include <stdio.h>
函数原型:
char *fgets(char *s, int size, FILE *stream);
参数分析:
s --> 用于存放获取到的数据
size --> 期望获取多少字节的数据
stream --> 文件的指针流 每一个程序运行都自动打开(以下三个文件流指针是系统赠送的)
stdin --> 标准输入
stdout --> 标准输出
stderr --> 标准出
返回值:
成功 返回 指针 s
失败 返回NULL
注意:
scanf 非常矫情,如果代码中是%d那么用户必须输入一个整型,否自该数据将留在缓冲区中;
格式控制符 format 在用户输入参数中时必须严格代码中的格式来输入;
while(' ' != getchar());//函数getchar()可以自动获取缓冲区字符,使用该语句可将缓冲区清空,scanf()应与其配合使用;
数据类型转换
互相兼容但是又不同的数据类型之间可以在同一个表达式中进行类型转换
隐式转换: 系统会按照隐式转换规则帮你转换。
强制转换: 用户主动要求转换
隐式规则:从类型的精度低到高的转换,目的是保证数据的精度在运算过程中不会丢失。
char --> short --> int --> long --> long long --> float --> double --> long double
低精度 ----------------------------------------------------------------------------> 高精度
注意,永远都是右值转换成符合左值人为定义的类型。
int a = 100 ;
char b = 99 ;
float f = 3.998 ;
float x = a + b + f ; // 在当前表达式中所有类型都会被隐式转换为 float
注意:
不管是强转还是隐式转换 都只发生在表达式中临时被转换,并不会影响变量本身;
当有符号类型碰到无符号类型的运算都会被系统自动转换成无符号类型。
可移植类型
为了在不同系统中都保持程序中的数据尺寸保持不变,可以使用关键字typedef来实现,如:
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
系统预定好的一些类型:/usr/include/x86_64-linux-gnu/bits/types.h