C语言笔记(八)-ifndef与endif/截断/整型提升/图复杂度/ 原反补码

1.头文件的重复引用

如果在file1.c文件中include了两个头文件file2.h与file3.h,但是file2.h也include了file3.h,所以会重复引用file3.h。

为避免此情况,要使用#define进行保护,注意不要使用#pragma once

#ifndef FILE3_H
#define FILE3_H

// 省略

#endif

2.定义在函数内部的宏变量在外部仍是可见的。

3.bool变量在判断时候不要和true与false比较

// 此种写法更规范。
if (found) {  
    // code
}

4.截断

在c语言中进行变量赋值的时候,如果将字节多的数据类型赋给一个占字节少的变量类型,会发生“截断”。发生这种情况的原因是:在赋值过程中只将占字节较长的变量的地位赋给占字节较少的变量。

比如把int类型存到char类型中,如下:

int main()
{
    int a = 453;
    char c;
    c = a;
    printf("%d\n", c);
 
    return 0;
}

// 453→00000000 00000000 00000001 11000101
// 变为1字节 11000101→197

5.整型提升

就是在表达式计算时,将一些小整数类型转换成较大的整型类型。eg; bool、char、signed char、unsigned char、short和unsigned short只要能存在int里面都会提升为int类型,如果超了就提升为unsigned int类型。

整型的提升规则是:

1.若是有符号数,则前面位数补符号位。

2.若是无符号数,则前面8*3位补0。

这里面有问题就是:

如果某个运算符的运算对象类型不一致,这些运算对象将转换成同一类型。但如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个类型的相对大小了。

仍以上面为例子:

11001010进行整型提升,他是有符号位的
第一位1被认为符号位
提升后:1111111 1111111 11111111 11001010
转化为补码: 1000000 00000000 00000000 00111011 -> -59

6.图的DFS与BFS时间复杂度

两种遍历方法时间复杂度是相同的。

采用邻接矩阵存储结构,二者的时间复杂度为O(n²)

采用邻接表存储结构,二者时间复杂度为O(n+e),e为边数。

7. int存储

计算机存储的都是补码,正数的原码 反码 补码相同,负数的反码是原码除了符号位外,按位取反;补码是在反码的基础上+1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值