C语言学习(三)
#include <stdio.h>
int main(void){
int a;
scanf("%d",&a);
printf("%d",a);
return 0;
}
&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值,需要按一下enter键,主要是为了告诉程序我已经输入完了
如果运行程序时是一闪而过的情况,就需要使用两次getchar(),getchar()作用是让程序暂停,等待输入,第一次是输入了数字,第二次是等待输入,打印的结果就会出来,如果没有scanf()只有printf(),使用一次即可
使用scan()可能会出现以下错误:
解决方法:
1.把scanf()换成scanf_s() #不推荐使用,为非C语言标准函数,是微软自己添加的
2.在代码第一行添加 #define _CRT_SECURE_NO_WARNINGS
%.2f代表只输出小数点后两位
变量是随时会发生变化的量,如成绩
常量是不会发生变化的量,如圆周率
int 基本整数类型,long short unsigned和c90新增的signed用于提供基本整数类型的变式
如long long int。char用于指定字母和其他字符(*,#),char也可以代表较小的整数。float,dobule,long dobule表示带小数点的数。_Bool代表布尔值(True,False),_Complex和_Imaginary代表复数和虚数。
两大基本数据类型,整数类型和小数类型。
字(word)是设计计算机之初给定的自然存储单位。现在的32位,64位计算机,计算机的字长越大,数据转移越快,允许访问的内存也越多。1 bytes 字节=8bit(比特)
C语言基本数据类型:
整型数据
int 有符号的整型数据
早期是16位计算机,int 范围(-2^15,2^15-1)即(-32768,32767),是ISO C规定的int最小取值范围,ISO是国际标准化组织,现在不管是32位还是64位的计算机,都用一个32位储存一个int值,int 范围(-2^31,2^31-1)即(-2147483648~2147483647),用一位特殊位的值来表示符号,也就是正负。
1.声明多个int 变量:
第一种
int a;
int b;
第二种
int a,b;
2.给变量值:
(1).直接赋值
int a;
a=10;
(2).scanf()获取输入的值
int a;
scanf("%d",&a);
(3). 初始化变量
int a=10;
不要把未初始化的变量和初始化的变量放在同一条声明中,如下面
int a,b=10; //a没有值,b的值为10
注意有小数点和指数表示的数均不是整型,如 1.0,1E
%d指明了在一行中整数打印的位置,也是转换说明,指定printf()用什么格式显示一个值。格式化字符串%d 对应int。使用printf()时注意说明的数量要与打印的数量相同,编译器不会捕获这种错误,会输出内存中的一个值
#include <stdio.h>
int main(void) {
int a = 1;
printf("%d is %d", a);
return 0;
}
正在上传…重新上传取消正在上传…重新上传取消
3.8进制和16进制
在c语言中int 大多为16进制数,0x,0X代表十六进制的数, 0代表八进制数,%o显示八进制数,%x显示16进制数,要显示数的前缀需要使用%#o,%#x,%#X
#include <stdio.h>
int main(void) {
int a = 133;
printf("shi is %d,ba is %o,hex is %x\n", a, a, a);
printf("shi is %d,ba is %#o,hex is %#x\n",a,a,a);
return 0;
}
4. 其他整数类型
short int 或short ,可能比int 占用的储存空间小,较小数值,有符号类型
long int 或long ,可能比int 占用的储存空间大,较大数值,有符号类型
longl long int或long long ,可能比long占用的储存空间大,有符号类型,c99标准添加
unsigned int 或unsigned,用于非负值,16位取值范围(0,2^32-1)0-65535,无符号类型可以表示更大的整数,unsigned long int 或unsigned short int 和unsigned short int 或unsigned short,c90标准添加,c99标准用添加了unsigned long long int 或unsigned long long ,无符号类型
在任何有符号类型前面添加关键字signed,可以强调有符号类型的意图。如short ,short int,signed short int ,signed short都是同一种类型。
现在个人计算机常见的设置是,long long占64位,long占32位,short占16位,int 占16位或32位,在使用的过程中,有一部分数值是重叠的
#include <stdio.h>
int main(void) {
int a;
short b;
long c;
long long d;
printf("占用空间大小为%d\n",sizeof(a));
printf("占用空间大小为%d\n", sizeof(b));
printf("占用空间大小为%d\n", sizeof(c));
printf("占用空间大小为%d\n", sizeof(d));
return 0;
}
这里大小为字节,1字节=8比特,int 占32位,short占16位,long 占32位,long long占64位
在有些情况下需要用long储存小的数,一些C语言标准函数要求使用long类型的值,把一个较小的值当作long 类型,可以在值末尾加小写的l或L后缀,在一台int为16,long为32位的机器上,把6当做16位储存,6L当作32位储存。
在支持long long 类型的机器上,ll或LL表示long long 类型的值,如4LL,u或U表示unsigned long long ,如4llu,4ull,4LLU,4ULL
5. 整数溢出
#include <stdio.h>
int main(void) {
int a = 2147483647;
unsigned int b= 4294967295;
printf("%d %d %d\n",a,a+1,a+2);
printf("%u %u %u\n",b,b+1,b+2);
return 0;
}
%u表示打印unsigned int的值,当无符号溢出时超过最大值时会从0开始,有符号则从最小值开始
c语言未定义有符号类型的溢出规则,可能会出现其他情况。
%ld表示打印long类型的值,如果int 和long类型的大小相同,用%d也可以,但当int 和long大小不同,就会出现错误,%lx表示打印16进制的long类型值,%lo表示打印8进制的long类型值
%hd表示打印short类型的值,%ho表示打印8进制的short类型值,%lu表示打印unsigned long的值
支持long long 系统的系统,%llu表示打印unsigned long long 的值,%lld 表示打印long long的值
使用错误的转换说明(占位符)会得到意想不到的结果
如果待打印的值大于有符号的最大值时会发生下面的情况,如果告诉printf()该数是无符号数,打印一个值,如果告诉是有符号值,将打印另一个值,,对于较小数,无符号还是有符号类型的储存和显示都相同
#include <stdio.h>
int main(void) {
unsigned int a = 10;
unsigned int b = 3000000000;
printf("%u %d\n", a, a);
printf("%u %d\n", b, b);
return 0;
}
在int和short大小不同的计算机中,short类型会自动转成int类型,int类型处理数据更高效,传递速度快,用%hd和%d打印出的数值相同,%hd可以显示较大数据被截断成short类型的情况,使用%hd的printf()只会查看32位二进制的后16位,使用%ld的printf()只会查看64位二进制的后32位
使用printf()保证待打印的值和转换说明类型相匹配,还要保证转换说明个数和参数个数相同
char类型数据(字符型数据)
char类型表示字母或标点符号
char类型在计算机储存的是数字,从技术层面上来看,char是整型数据。
计算机采用数字编码来处理字符,即特定的数字表示特定的字符。常用的编码是ASCII码,
ASCII码范围0-127,用7位二进制数表示就可以了。通常char是8位来储存数据,即1 byte(字节),其他系统提供扩展ASCII码(0-255)。其他国家字母超过255,就有了其他编码,如unicode,占用2个字节,2^16可以表示世界上所有的字符。为了节省空间,出现了可变长unicode,如utf-8,utf-32。
1.字符常量和初始化:
char字符常量指的是下方正确表示的值,char类型变量指的是下方a,b,c,d
char a='a'; √
char c=d; × 表示的是变量
char e="f"; × 表示的是字符串
char b=65; √ 此种方法不好,如果系统不支持ASCII码,就会出问题
2. C语言中把字符常量视为int类型而非char类型。
在32位系统中,int占32位,char占8位。
定义一个char常量为fate,把4个8位的ASCII码储存到一个32位的储存单元中,如果把该值赋值给变量a,会出现只有最后8位有效,也就是a的值位e。%c打印char类型的值
#include <stdio.h>
int main(void) {
char a = 'fate';
printf("%c",a);
return 0;
}
3.单引号只能打印字母、数字、标点,有些ASCII字符打印不出来。如,一些代表行为的字符,退格,换行
打印方法:
(1)使用ASCII码值,前提系统支持ASCII码
char a=7;
(2)使用转义序列,使用特殊的符号来表示特殊的字符
char a='\n';
\0oo 8进制
\xhh 16进制
'\007','\7','\07'都可以
(3)使用16进制数来表示
char a='\x0a';
char a='\xa';
4.有符号还是没符号
有些编译器把char定为有符号类型,char取值范围-128-127。而有些编译器把char视为无符号类型,char取值范围0-255。在C90标准中允许在char前面加上siged和unsigned表示有符号和无符号
_Bool类型
_bool,true和false,代表0和1,实际上也是一种整数类型
可移植类型:stdint.h和inttypes.h
C预言为实现现有类型提供了更多类名,C99。这些新的类型定义在stdint.h中,int32_t表示32位有符号整数类型。在int为32位的系统中,头文件会把int32_t作为int的别名。不同系统也可以定义相同的别名。例如,在int为16位,long为32位的系统中会把int32_t作为long的别名。使用int32_t编写程序,并包含stdint.h头文件时,编译器会把int或long替换成与当前系统匹配的类型。此种类型别名叫做精确宽度整数类型。
int32_t表示的整数类型宽度刚好是32位,但如果系统不支持精确宽度整数类型(不支持C99),还有另一中类型,能保证指示的类型一定是至少有指定宽度的最小整数类型。这类被称作最小宽度类型,int_least8_t表示可容纳8位有符号整数值类型中最小的类型的一个别名。如果系统int为16位,可能不会使用int8_t,但是能可以使用,但可能把int_least8_t当作16位来处理。
还有一种类型是计算速度达到最快的类型集合叫做最小最快宽度类型。int_fast8_t示可容纳8位有符号整数值类型中运算最快的类型的一个别名
C99定义了最大的有符号类型intmax_t,可以储存任何有效的有符号整数值。uintmax_t表示无符号整数类型,可能比long long 和unsinged long更大。
打印int32_t时,有些%d,有些%ld,解决这种方法,提供了字符串宏来显示可移植类型。在inttypes.h提供了PRId32.
#include <stdio.h>
#include <inttypes.h>
int main(void) {
int32_t a = 555;
printf("a=%d\n",a);
printf("a=""%d""\n", a);
printf("a=%"PRId32"\n",a);
return 0;
}
在C语言中可以把多个连续的字符串合成一个字符串。
printf("a=%d\n",a); 等价于 printf("a=""%d""\n", a);
float、dobule、long dobule类型
C语言标准规定,float类型至少能表示6位有效数字。float占32位,8位表示指数的值和符号,剩下的24位用于表示非指数(尾数和有效数)即其符号。
C语言标准规定,doubule,双精度,最小取值范围相同,但至少能表示10位的有效数字。一般情况下,double占64位,无论哪种方法,dobule至少有13位有效数字,超出了标准的最低位数
long dobule,类型精度至少和double类型相同
浮点型常量表示时可以省略小数点或指数部分,但不能同时省略,如2e5,1.1;可以省略小数部分或整数部分,但不能同时省略,如3.e16,.45e-6,不能在浮点数常量中间加空格,如1.3 e16
默认情况下,编译器假定浮点数是dobule类型,在浮点数加上f或F,就会看作是float类型。可以使用l或L,看作是long double类型,C99添加了一种新的浮点常量 用16进制表示浮点型常量,p10是2的10次方,在16进制数加上前缀0x,用p和P代替e和E,用2的幂代替10的幂
打印时%f表示打印float和dobule类型的浮点数,%e打印指数类型的数,系统支持16进制,用a和A代替e和E。打印long dobule 使用%Lf,%Le或%La的转换说明
浮点数上溢和下溢
超出浮点数表示的最大范围时,打印结果显示inf或infinity,表示无穷大
下溢,在计算过程中损失了原末尾有效位数的数字
复数和虚数
参考书籍:
《C Primer Plus 中文第6版》