!和~的区别
~:表示按位取反,1变成0,0变成1。
!:表示逻辑取反,false变ture,true变false,在C语言中,逻辑取反的对象只要不是0就表示为真。
//示例:
!5 = 0
~5 (二进制00000101,取反11111010)= -6
[~表示按位取反,!表示逻辑否定]
所有的不是0的数用!操作后都是0;
只有当操作数为0xFFFFFFFF时,使用!和~的结果值才是一样的。
* 另外可以注意
* 所有正整数的按位取反是其本身+1的负数,所有负整数的按位取反是其本身+1的绝对值
* 0的按位取反是-1
include头文件路径
#include <>:引用的是编译器的类的库路径的文件;
#include “”:引用的是你程序目录的相对路径的头文件;
限位符%02x
%mn(x):m表示输出不足n列则以m字符补充,m一般为0,n表示输出宽度为n列,(x)表示输出格式控制符;
%m.nf:代表输出的浮点数宽度为m位(小数点占一位),小数点后面保留n位小数,如果输出的数值不足m位,则前面用空格补足,如果超过,则按超过的实际输出。
//示例:
%012d: printf("%012d", 123);
输出:000000000123
%12d:printf("%12d", 12);
输出:12个宽度,12占两个宽度,10个宽度为空白: 12;
%15.6f:printf("%15.6f", 3.12);
输出: 3.120000
常用的printf函数的格式控制符号:
- %u 无符号10进制整数;
- %x 无符号16进制整数;
- %i 有符号10进制整数;
- %o 无符号8进制整数;
- %f 以小数形式输出单、双精度实数;
- %e 以指数形式输出单、双精度实数,指数标识为e;
- %G 以%f%E中较短的输出宽度输出单、双精度实数,在指数小于-4或者大于等于精度时使用%E格式;
- %g 用于打印浮点型数据,会去掉多余的零,至少保留六位有效数字;
- 0x表示16进制,0b表示2进制;
函数调用协议
__stdcall、__cdecl和__fastcall是三种函数调用协议,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、
编译器函数名的修饰规则等
调用协议常用场合:
*__stdcall:windows API默认的函数调用协议。
- __cdecl:c/c++默认的函数调用协议。
- __fastcall:适用于对性能要求较高的场合。
函数参数入栈方式:
- __stdcall:函数参数从右向左入栈。
- __cdecl:函数参数由右向左入栈。
- __fastcall:从左开始不大于4字节的参数放入CPU的ECX和EDX寄存器。
栈内数据清除方式:
- __stdcall:函数调用结束后由被调用函数清除栈内数据。
- __cdecl:函数调用结束后由函数调用者清除栈内数据。
- __fastcall:函数调用结束后由被调用函数清除栈内数据
C语言编译器函数名称修饰规则
- __stdcall:编译后,函数名被修饰为“_functionname@number”。
- __cdecl:编译后,函数名被修饰为“_functionname”。
- __fastcall:编译后,函数名给修饰为“@functionname@nmuber”。
注:“functionname”为函数名,“number”为参数字节数。
注:函数实现和函数定义时如果使用了不同的函数调用协议,则无法实现函数调用。
C++语言编译器函数名称修饰规则
- __stdcall:编译后,函数名被修饰为“?functionname@@YG******@Z”。
- __cdecl:编译后,函数名被修饰为“?functionname@@YA******@Z”。
- __fastcall:编译后,函数名被修饰为“?functionname@@YI******@Z”。
注:“******”为函数返回值类型和参数类型表。
注:函数实现和函数定义时如果使用了不同的函数调用协议,则无法实现函数调用。
C语言和C++语言间如果不进行特殊处理,也无法实现函数的互相调用。
a[-1]
a[-1]是有意义的,而且有这样用的代码!
比如我们知道数组下标是从0开始的,那假如我们想从1开始怎么办?
定义一个指针,指向a[-1]这个位置。。
因为数组并不检查下标是否越界;
下标仅表示偏移,-1就表示第一个元素前面那个元素;
ascii表
const字符
C语言中const关键字用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。与#define定义的预编译指令相比,他有以下优点:
1、预编译指令只对值进行简单的替换,不能进行类型检查
2、const可以保护被修改的东西,防止意外修改,增强程序的健壮性。
3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,使它们在编译期间成为2一个常量。没有使用存储和读内存的操作,效率增高。
空结构体的大小
空结构体的大小是1个字节