跟“龙哥”学C语言编程day2

字符型常量

用单引号括起来的一个字符是字符型常量,且只能包含一个字符ps:‘’也是错误的
以“\”开头的特殊字符简称为转义字符。

\r回到行首,输入的字符会替换原来的字符。
在这里插入图片描述\b向前退一格
在这里插入图片描述

字符数据在内存中的存储形式及其使用方法

字符型变量使用关键字char进行定义,一个字符型变量占用一字节大小的空间。
一个字符常量存放到一个字符型变量中时,实际上并不是把该字符的字型放到内存中,而是把该字符的ASCII码值放到存储单元中。

ps:小写字母与大写字母ASCII码差32,数字字符0的ASCII码为48。

字符串型常量

字符串型常量是由一堆对双引号括起来的字符序列。·ps:‘a’是字符型常量,“a"是字符串型常量,两者是不同的。
C语言规定,在每个字符串型常量的结尾加一个字符串结束标志,以便系统据此判断字符串是否结束。C语言规定以字符‘\0’作为标志字符串结束标志。
在这里插入图片描述字符串型常量在内存中的存储结果如图,占用的内存单元不是5个字符,而是6个字符,即大小为6个字节,最后一个字符为‘\0’。输出时不输出’\0’。因为‘\0’无法显示。

混合运算

字符型、整型、浮点型数据可以混合运算。运算时,不同类型的数据首先要转换要转换 为同一类型,然后进行运算。从短字节到长字节的类型转换是由系统自动进行的,编译时不会给出警告;若反向进行,则编译时编译器会给出警告。

数值按int型运算

C语言中的整型数算数运算总是以默认整型类型的精度进行的。为了获得这个精度,表达式中的字符型和短整型操作数在使用之前会被转换为基本整型(int型)操作数,这种转换被称为整型提升。

在这里插入图片描述
输出%x是取4字节进行输出的;b中存储的只有93,为什么前面打印了3字节的ff,也就是6个f,当我们用%x输出一个少于4字节的数时,前面补的字节是按照对应数据的最高位来看的,因为字符b的最高位为1,所以其他3字节补的都是1。
在这里插入图片描述
为什么操作分两步后,b的值就变为13了,当0x93左移一位时,虽然是按4字节进行,但是最低一字节的值为0x26,赋给了b,当b再进行右移运算时,此时b为0x26,最高位为0,前面3字节补0,,再右移时就从 0000 0000 0000 0000 0000 0000 0010 0110(10进制为26)变成0000 0000 0000 0000 0000 00000 0000 0001 0011(10进制为13)相当于26除以2;(高位补0,低位丢弃)ps:如果最高位是1,前面补了3
字节的f,那么高位就补的是1。

在这里插入图片描述
在进行运算时,默认整型常量是int类型,内存中是以4字节存储的,因为131072*131072,4字节存储不了,所以将131072放在8字节中存储,如果i的类型还是int,那么就会导致i的内存溢出。
如果是64位程序可以用long类型,在64位下long是8字节进行存储的。

浮点型常量默认按double型运算

浮点型常量默认按8字节运算
浮点数主要记一下精确的有效数字,防止精度丢失。

类型强制转换场景

整型整数进行除法运算时,如果运算结果为小数,那么存储浮点数时一定要进行强制类转换。

常用的数据输入/输出函数

程序员可以给程序输入数据,程序处理后返回一个输出。C语言通过函数库读取标准输入,然后通过对应函数处理将结果打印到屏幕上。

scanf函数的原理
C语言未提供输入/输出关键字,其输入/输出时通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又称为标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被阻塞。

在这里插入图片描述
会发现第二个scanf没有被阻塞,是因为第二个scanf读取了缓冲区的\n,所以打出来的ASCII码为10。

缓冲区原理

缓冲区是一段内存空间,分为读缓存、写缓冲。C语言缓冲的三种特性如下:
1、全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作
。全缓冲的典型代表是对磁盘文件的读写。
2、行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的I/O操作。这时,我们输入的字符先存放在到缓冲区,等待按下回车键换行时才进行实际的I/0操作。典型代表是标准输入缓冲区和标准输出缓冲区。
3、不带缓冲:也就是不进行缓冲,标准出错情况是典型代表,这使得出错信息可以直接尽快地显示出来。
以上面为例:我们向标准输入缓冲区中放入的字符为’3\n’,输入\n后,scanf函数开始匹配,scanf函数中的%d匹配整数3,然后放入变量i中,接着进行打印输出,这时‘\n’任然在标准输入缓冲区内,如果第二个scanf函数为
scanf("%d",&i),那么依然会发生阻塞,因为scanf函数在读取整型数、浮点数、字符串时,会忽略‘\n’、空格符等字符(忽略是指scanf函数执行时会首先删除这些字符然后再阻塞)。scanf函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行,scanf(”%c",&c)语句时,不会忽略任何字符,所以读取了还在缓冲区内的‘\n’。

可以使用rewind(stdin)清空标准输入缓冲区。
在这里插入图片描述

scanf函数的循环读取

如果想到输入多个整数,每次输入都回车,让scanf函数读取并打印,那么我们需要一个while循环,代码中为什么要加入rewind,是因为如果误输入了一些东西时,在下一次进入循环时可以阻塞,scanf函数未匹配成功时返回0,EOF的返回值为-1

在这里插入图片描述
如果不加rewind,当输错时,scanf匹配失败,ret返回0,此时while循环永真,所以进入死循环。

多种数据类型混合输入

当我们让scanf函数一次读取多种类型的数据时,对于字符型数据要格外小心,因为当一行数据中存在字符型数据读取时,读取的字符并不会忽略空格和’\n’,scanf函数匹配成功了几个成员,返回值就为多少

getchar函数介绍

使用getchar函数可以一次从标准输入读取一个字符,它等价于char c,scanf(“%c”,%c);
函数定义为:int getchar(void);
返回值是int类型

putchar函数介绍

输出字符型数据时使用putchar函数,其作用是向显示设备输出一个字符,
函数定义为:int putchar(int ch);

printf函数介绍

printf函数可以输出各种类型的数据,包括整型,浮点型、字符型、字符串型等,实际原理是printf函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后通过‘\n’来刷新标准输出,并将结果显示到屏幕上。
函数定义 int print(const char *format,…);
printf函数根据format给出的格式打印输出到stdout(标准输出)和其他参数中。
字符串格式由两部分组成:显示到屏幕上的字符和定义printf函数显示的其他参数。
%c 字符
%d 带符号整数
%i带符号整数
%e科学计数法,使用小写”e“
%E科学计数法,使用大写”E“
%f 浮点数
%o,八进制数
%s 字符串
%u 无符号整数
%x 无符号十六进制整数,小写字母
%X 无符号十六进制整数,大写字母
%p 一个指针
%% 一个 %
位于%和格式化命令之间的一个整数被称为最小字段宽度说明符,通常会加上足够多的空格或0使输出足够长。如果想填充0,那么就在最小最小字段宽度说明符前面放置0

用%e、%E,%f精度修饰符指定想要的小数位数
用%s精度修饰符简单地表示一个最大的长度,以补充句点前的最小字段长度。
默认右对齐,加-左对齐

运算符分类

(1)算术运算符 (±*、%)
(2)关系运算符 (>< == >= <=!=)
(3)逻辑运算符(!&&||)
(4)位运算符(<< >> ~ | ^ &)
(5)赋值运算符(=及其扩展赋值运算符)
(6)条件运算符(?:)
(7)逗号运算符(,)
(8)指针运算符(&,*)
(9)求字节数运算符(sizeof)
(10)强制类型转换运算符((类型))
(11)分量运算符(. ->)
(12)下标运算符 ([ ])
(13)其他(如函数调用运算符())

算术运算符以算术表达式

乘、除、取余运算符优先级高于加、减
由算术运算符组成的式子称为算术表达式,表达式一定有一个值
%只适用于整型,其余既适用于整型又适用于浮点型

有两个整型变量a与b,假如在不使用第三个变量的情况下,交换变量a和b的值
int a=a+b;
b=a-b;
a=a-b;

关系运算符与关系表达式

由关系运算符组成的的表达式称为关系表达式。关系表达式的值只有真和假,对应的值为1和0。
由于C语言中没有布尔类型,所以在C语言中0值代表假,非0值即为真。
关系运算符的优先级低于算术运算符

逻辑运算符与逻辑表达式

逻辑非的优先级高于算术运算符,逻辑与和逻辑或的优先级低于关系运算符

使用短路运算减少代码量,例子:0||printf(”hello");,1&&printf(“hello”);

位运算符

左移:高位丢弃,低位补0,相当于乘2.
右移:低位丢弃,正数的高位补0,负数高位补1.
正数:除以2
负数:奇数-1再除以2 偶数 除以2
异或:相同为0,不同为1,相同的数进行异或为0,任何数与0异或都为其本身
按位取反:数位上的数是1变为0,0变1
按位与和按位或:用两个数的每一位进行与和或

有两个变量a与b,在不使用第三个变量的情况下,通过异或操作来交换这两个变量的值。
int a=a,b=2;
a=a^b;
b=a ^ b;
a=a^b;

如何用位运算找到一个数的最低位为1的那一位,不使用循环,复杂度为O(1)。

对该数取反加+1再进行按位与
int n;
int x=n&(-n);

赋值运算符

左值是那些能够出现在赋值符号左边的东西,右值是那些可以出现在赋值符号右边的东西。

复合赋值运算符操作是一种缩写形式,使用复合赋值运算符能使对变量的赋值操作变得更加简洁。
iNum=iNum+5;等价于iNumn+=5;
功能:1、简洁2、提高编译效率

条件运算符与逗号运算符

条件运算符是C语言中唯一的一种运算符。
三目运算符代表有三个操作数;双目运算符代表有两个操作数。
逗号运算符优先级最低,逗号表达式的整体值是最后一个表达式的值。

自增自减

自增自减需要分开两条语句计算,j++或者j–我们需要先去掉++或–,先计算表达式,再单独计算++或–;例子:j=i++>-1;可以拆分j=i>-1;i++;

同理++/–在前面,先单独计算++或–。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值