C语言数据类型和变量
一. 引言
本章主要讲解了数据类型,,变量,占位符,scanf,printf
二. 数据类型
主要分两类:内置类型,自定义类型
ubsigned int
占位符:%u
ubsigned int
占位符:%lu
ubsigned int
占位符:%llu
sizeof
是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof
的操作符数的类型⻓度的,单位是字节。
sizeof
操作符的操作数可以是类型,也可是变量或者表达式
sizeof(类型)
sizeof表达式
1.计算结果是
size_t
型,统一表示返回类型
2.sizeof
后面为表达式时,括号可以省略
3.sizeof
后面为表达式时,表达式不参与计算,根据表达式的类型得出大小
大小(字节):
char
:1
_Bool
:1
short
:2
int
:4
long
:4
long long
:8
float
:4
double
:8
long double
:8
三.signed
和unsigned
signed
:包含正负值
unsigned
:包含零和正整数
int
=signed int
unsigned
好处是同样长度的内存表示最大整数,大了一倍
unsigned int
中int
可以省略
unsigned a;
char
!=signed char
四.变量
变量创建与初始化:
int a;
int a=0;
变量分为:全局变量和局部变量( 变量名相同,局部优先)
局部变量放在内存栈区
全局变量放在内存静态区
五.scanf
和printf
介绍
printf()
的占位符有许多种类,与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序,列出常⽤的占位
符,⽅便查找,具体含义在后⾯章节介绍。
• %a
:⼗六进制浮点数,字⺟输出为⼩写。
• %A
:⼗六进制浮点数,字⺟输出为⼤写。
• %c
:字符。
• %d
:⼗进制整数。// int
• %e
:使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E
:使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
•%i
:整数,基本等同于 %d 。
• %f
:⼩数(包含 float 类型和 double 类型)。//float %f double - %lf
• %g
:6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写。
• %G
:等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd
:⼗进制 short int 类型。
• %ho
:⼋进制 short int 类型。
• %hx
:⼗六进制 short int 类型。
• %hu
:unsigned short int 类型。
• %ld
:⼗进制 long int 类型。
• %lo
:⼋进制 long int 类型。
• %lx
:⼗六进制 long int 类型。
• %lu
:unsigned long int 类型。
• %lld
:⼗进制 long long int 类型。
• %llo
:⼋进制 long long int 类型。
• %llx
:⼗六进制 long long int 类型。
• %llu
:unsigned long long int 类型。
• %Le
:科学计数法表⽰的 long double 类型浮点数。
• %Lf
:long double 类型浮点数。
• %n
:已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o
:⼋进制整数。
• %p
:指针(⽤来打印地址)。
• %s
:字符串。
• %u
:⽆符号整数(unsigned int)。
• %x
:⼗六进制整数。
• %zd
: size_t 类型。
• %%
:输出⼀个百分号。
占位符宽度设置:
%md
不满m位自动加空格
左对齐在%后面加-,默认右对齐。
对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度
#include <stdio.h>
int mian()
{
printf("%12f\n",123.45);
return 0;
}
对于上述代码,浮点数最少占位12位,浮点数显示精度是小数点后6位,所以123.45会在头部添加两空格。
默认情况下,printf()
对正数不显示+
对负数显示-
,如果要显示+
,在%后加上+
#include <stdio.h>
int main()
{
printf("%+d\n",12);//输出+12;
printf("%+d\n",-12);//输出-12;
return 0;
}
输出小数控制位数:保留两位小数:
%.2f
,可以与宽度占位符一起使用
#include <stdio.h>
int main()
{
printf("%6.2d\n",0.5);
return 0;
}
输出字符串最小宽度为6,小数为2,所以头部两空格。
还可以这样写:
#include <stdio.h>
int main()
{
printf("%*.*d\n",6,2,0.5);
retunr 0;
}
%.[m]s
输出部分字符串(防止字符串溢出)
#include <stdio.h>
int main()
{
printf("%.5s/n","hello world");//输出hello
return 0;
}
scanf()
处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
scanf()
处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存
进⾏解读。
解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条
件的字符为⽌。
#include <stdio.h>
int main()
{
int x;
float y;
//用户输入" -13.45e12# 0"
scanf("%d",&x);//-13
printf("%d\n",x);
scanf("%f",&y);//。45e12
printf("%f\n",y);
return 0;
}
首先
scanf()
会跳过空格%d
从-
读取到3
结束.
不属于有效字符,第二次调用从.
开始到2
结束#
不属于有效字符
scanf()
如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到jiang⽂件结尾,则返回常量EOF
(-1)。
%c
不会忽略空白字符,总是返回当前第一个字符
强制跳过空白字符这样写scanf(" %c",&ch)
,%c
前面加空格,表示跳过零个或多个空格
%s
遇到空⽩字符(即空格、换⾏符、制表符等)会停止,会在末尾存放一个空字符\0
赋值忽略符
*
:加在%后面,该占位符不会返回值,解析后被丢弃
#include <stdio.h>
int main()
{
int year;
int month;
int day;
scanf("%d%*c%d%*c%d",&year,&month,&day);//2022-2-10
return 0;
}