C语言基础(二)
运算符
单算移关与,异或逻条赋
单目运算符
++, - -
++运算符(前自负)
1、++符号在前,先自加,后赋值
2、++符号在后,先赋值,后自加
注意:当a++或者++a这两种语句,单独成为一条语句时,都相当于a=a+1
关系运算符
(>, <, >=, <=, ==, !=)
- 等号的书写(判断相等时,少一个=,会报错)
算术运算符
+,- , *, /, %
- %
取模运算,求余数
注意:%不能用于浮点数
- /
除法运算,取整
eg:
(1)表达式(int)((double)5/2+2.5)的值是5
解析:(int)(2.5+2.5)=5
(2)表达式(int)((double)(5/2)+2.5)的值是4
解析:(int)(2.0+2.5)=4
逻辑运算符
&&, || ,!
&&:
截断法则:有一个为假,整体结果就为假;前一个为假,后面就不再进行运算了
||
截断法则:有一个为真,整体结果就为真;前一个为真,后面就不再进行运算
!
逻辑非,对一个布尔值进行取反操作
sizeof运算符
sizeof(数据类型);
sizeof(变量名);
作用:求对对应数据类型或者变量名所占内存空间大小
注意!使用sizeof()计算时,需要使用%ld来进行占位
三目运算符
表达式1?表达式2:表达式3
运行含义:判断表达式1的值是否成立,如果成立,就将表达式2的值作为整个表达式的值,反之则将表达式3的值作为整个表达式的值
逗号运算符
(表达式1,表达式2,表达式3,…表达式n)
运行含义:从左往右依次计算每个表达式的值,将表达式n的值作为整个表达式的值
注意!
1、必须依次计算,防止前面的表达式改变了表达式n中的变量
2、逗号表达式的运算优先级最低,因此在使用的时候需要加上括号
位运算符
& ,| ,~ , << ,>>, ^
&
含义:全为1,才为1,有一个为0,则为0
|
含义:全为0,才为0,有一个为1,则为1
取反运算符(~)
含义:0变1,1变0
异或运算符
含义:相同为0,不同为1
左移
unsigned
- 只有正数,没有符号位(原码、反码、补码都一样)
- 高位丢弃,低位补0
eg:
将1左移2位
0000 0001——>0000 0100——>4
signed
- 有正数有负数,有符号位
- 符号位不变,高位丢弃,不论正数负数,低位补0
eg:将-1左移2位
1000 0001——>1000 0100
右移
unsigned
- 只有正数,没有符号位(原码、反码、补码都一样)
- 低位丢弃,高位补0
eg:
将4右移2位
0000 0100 ——> 0000 0001 ——>1
signed
- 有正数有负数,有符号位
- 符号位不变,低位丢弃,正数高位补0,负数高位补1
eg:
将-4右移2位
数组的存储都是以补码存在在计算机中
所以要将原码换成补码,再右移
原码:1000 0100
反码:1111 1011
补码:1111 1100
右移:1111 1111(补码)
原码:1000 0001
总结:
1、左移:无符号数,高位丢弃,低位补0
2、左移:有符号数,符号位不变,高位丢弃,低位补0
3、右移:无符号数,低位丢弃,高位补0
4、右移:有符号数,符号位不变,低位丢弃,高位补1
输入输出
输出函数
printf(“格式控制串+格式化符”, 输出表);
- 格式控制串:原样输出的内容+格式化符(%d,%c,%f,%lf,%s,%p)
- 输出表:要输出的东西
整型
%d:以整型形式进行输出
%o:以八进制整型形式进行输出
%x、%X:以十六进制整型形式进行输出
#:自动在八进制和十六进制之间加上前缀
%u:以无符号整型形式进行输出
%hd:以short整型形式进行输出
%ld:以long整型形式进行输出
%lld:以long long整型形式进行输出
字符型
%c:以字符型形式进行输出
浮点型
%f:以浮点型形式进行输出
%lf:以双精度浮点型形式进行输出
%g:以指数形式和浮点形式中较短的方法进行输出
%e:以指数形式进行输出
%.nf:保留小数点后n位进行输出
%m.nf
m:指定我们输出的域宽:当m大于0时,默认右对齐,m小于0,默认左对齐
当m的值大于数据的实际长度时,补空格,m小于数据的实际长度,原样输出!
默认为右对齐方式,加上-表示左对齐。
输入函数
scanf(“格式控制串”, 地址表);
- 格式控制串:原样输入的内容+格式化符
- 地址表:&+变量名
- 注意:
1、 scanf格式控制串,不要加修饰语,如果要加,要原样输入
2、. 如果输入“%d%d”时,要给多个变量进行赋值,在格式控制串中,没有多余的修饰语时,那么输入以空格,回车,tab键作为第一个变量结束的标志
3、全部输入结束,必须以回车作为结束符
4、 如果以“%c%c”输入多个字符时,不能有回车,空格,tab键,因为空格,回车,tab键也是一个字符
解决办法
1、在%c和%c之间加上逗号或者空格
2、加上%*c,星号代表的是抑制符(吃掉一个字符)
3、%*nc:(吃掉n个字符)
4、getchar()吃掉一个字符
字符输入输出函数
字符的输入函数
getchar()
返回值:输入的字符的ascii码值
字符的输出函数
putchar()
参数:输出的字符的ascii码值
字符串输出输入函数
字符串输出函数
puts(参数)
1、函数功能::打印输出字符串,遇到’\0’结束打印,并自动换行
2、函数参数:需要打印的字符串的起始地址(字符数组名)
字符串输入函数
gets(参数);
1、函数功能:从键盘得到字符数据存放到字符数组中,并自动’\0’
2、函数参数:电脑去保存字符的数组名
3、注意:该函数不会进行越界检查,注意访问越界问题
gets和scanf对比
gets和scanf对比
- scanf以回车、空格、tab键作为输入结束符,gets以回车作为结束符
- scanf输入完成之后不会清空缓冲区,里面遗留回车、空格、tsb键,gets会清空缓冲区
- gets函数发现缓冲区有数据,会直接拿过来使用,否则,要求键入
- scanf只能以键入方式输入数据
puts和printf
puts函数输出的时候自动换行,printf函数不会自动换行
字符串处理函数
使用时需要引入头文件
#include <string.h>//C库的头文件
求字符串长度
strlen();
//函数功能:求字符串的实际长度
//函数参数:首元素地址
//注意:求出的值不包含'\0'
不使用库函数,求字符串实际长度
字符串拷贝函数
strcpy(字符数组1, 字符数组2/字符串2);
//函数功能:将参数2的数据拷贝到数组1里面去
//函数参数1:拷贝数据存放的位置(最终打印)
//函数参数2:需要被拷贝过来的数据
//注意:数组1的长度要大于数组2
//遇到'\0'停止拷贝
strncpy(字符数组1, 字符数组2/字符串2, n);
//函数功能:将参数2的前n个字符拷贝到字符数组1里面去
//遇到'\0'停止拷贝
不使用库函数,实现拷贝
字符串连接函数
strcat(字符数组1, 字符数组2/字符串);
//函数功能:将参数2的数据连接到字符数组1后面去
//字符数组1的空间需要足够大
strncat(字符数组1, 字符数组2/字符串2, n);
//函数功能:将字符串2的前n位连接到字符数组1后面去
不使用库函数,实现字符数组连接
字符串比较函数
strcmp(字符数组1/字符串1, 字符数组2/字符串2);
//函数功能:比较两个参数的大小
//函数返回值:
return value > 0 ---> 参数1 > 参数2
return value = 0 ---> 参数1 = 参数2
return value < 0 ---> 参数1 < 参数2
从左往右,每一个字符依次比较,直到遇到不同的ASCII值或者遇到’\0’结束