前言
之前一直在学新知识,最近打算复习一下之前学的,所以写了这篇文章,记录一下不熟练的知识点,自用,对大家帮助可能不是很大。
double类型与float类型
编译器默认7.0为double类型
在数据后加一个f,编译器就会认为7.0f为float类型
%的使用
取模
当%作为取模操作符来使用时,其左右两边必须是整数,不能是小数
打印%
当想打印出%时,使用%%,输出结果是%
#include<stdio.h> int main() { printf("%%"); return 0; }
输出结果:
!与~
!
逻辑反操作:真表示为假,假表示为真
#include<stdio.h> int main() { int a = 4; if (a == 4) { printf("1\n"); } if (!(a == 4)) { printf("1\n"); } else { printf("0\n"); } return 0; }
运行结果:
~
将1取反为0、0取反为1
注意:
位操作符,操作的都是补码
提示:
-1的补码是32个1
sizeof和strlen
sizeof运算符
计算的元素在内存中占用的空间大小,单位是字节
最根本的区别是:sizeof是运算符,不是函数。并且sizeof可计算任意数据类型的大小
(当我尝试搜一下sizeof的源码看看它是怎么实现的时候,发现,它是运算符…)
‘\0’
注意,在计算数组的字节大小时,是包含’\0’的,因为\0也是里面的元素之一
strlen函数
计算数组中的元素个数,返回值类型是size_t,
strlen是函数,不是运算符。并且strlen函数只能计算数组的元素个数
‘\0’
strlen函数是计算‘\0’之前的元素个数,遇到‘\0’停止读取,并返回一个无符号整数,
此处涉及到strlen函数是如何实现的,此处附上它的源码
size_t __cdecl strlen ( const char * str ) { const char *eos = str; while( *eos++ ) ; return( eos - str - 1 ); }
%g与%e
%g
在输出浮点型数据时,使用%g,编译器会选择是按照%f还是%e的方式来打印数据。哪种方式短就选择哪种,不输出无意义的0
%e
以指数的形式输出实数,
当对于输出无精度要求时,部分编译器自动认为小数部分有5位,指数部分有6位,
并且,小数点前只有1位(标准化指数形式)
示例:
下面用一段代码来区分%f、%e、%g
#include<stdio.h> int main() { float a = 123.321; printf("%f\n%e\n%g\n", a, a, a); return 0; }
%G和%E
就是e在打印时是大写
static修饰的(局部、全局)变量和函数
static:静态的
用法一:static修饰局部变量
我们都知道:
局部变量在每次进入函数会重新创建,出了函数就会销毁(将空间还给操作系统)
并且局部变量存储在栈区,进入作用域自动创建,出作用域自动销毁
本质:
使变量的存储位置发生了变化
注意:
变量的作用域没变,无法出作用域使用 ,即无法在变量所处函数外面使用
static延长的是生命周期
修饰后:
局部变量出了作用域不会回收,局部变量的生命周期被延长,如果反复调用函数,会出现累积的效果,如:累加、累乘等
此时的局部变量已经存储在静态区,直到程序结束,该变量才会被回收
多说一句:
static所在代码在编译期间已分配地址,其代码行在运行时不再执行,即其地址不再变化(静态区)
用法二:static修饰全局变量
1:
全局变量无法在其他源文件中被引用
2:
使其只能在其所在的源文件内部使用
(即使其外部链接属性变为内部链接属性)
用法三:static修饰函数
注意:函数不存在生命周期这种说法
修饰前:
函数具有外部链接属性,即可以在其他源文件内被调用(使用extern声明)
修饰后:
外部链接属性变为内部链接属性
函数只能在其所在的源文件内部使用,其他源文件无法使用
好处:
这样就能设多个名字相同的函数,并且也不会发生冲突
(应该很少有人其名字一样的函数吧)
输出控制符
此处就整理了一些我不太会的,比较常见的我就没整理
%p
输出指针地址
十进制输出
%hd
以有符号整型的形式输出short类型整数
%u
以无符号整型的形式输出unsigned int类型的整数
八进制输出
%o
无前缀,以无符号的方式输出int类型的整数
%#o
以有前缀、无符号的形式输出int类型的整数
十六进制
%x
以小写、无前缀、无符号的形式输出int类型的整数
%#x
有前缀的形式输出整数
%X
以大写的形式输出整数
移位操作符
左移操作符和右移操作符
左移操作符
左边丢弃、右边补0
有*2的效果
提示:即使是负数,其运算之后不改变符号
右移操作符
分为两种右移方式:算术右移和逻辑右移
逻辑右移:
右边直接丢弃,左边补0
算术右移:
右边直接丢弃,左边补符号位
原来是负数,左边补1
原来是正数,左边补0
有/2的效果
大部分编译器采用的都是算数右移
结语
先复习到这里,之后会接着复习指针及后面的知识