C语言基础冷知识汇总

!和~的区别

~:表示按位取反,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.6fprintf("%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个字节

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值