C语言小惑

1. C语言小惑

1. 操作符-按位取反(~)

问题:为什么打印出-1? 解答:

  1. 在32位操作系统里面,整数存放的位数为32位

整数a=0

00000000000000000000000000000000

11111111111111111111111111111111 ~a

  1. 一个整数的二进制的表示有3种,分别为原码、反码、补码。而整数在内存中存储的是补码

    -1:

    原码:1,0000000000000000000000000000001

    (第一位为符号位,1表示负数)

    先将原码转换成反码(符号位不变,其余按位取反):

    反码:1,1111111111111111111111111111110

    补码:1,1111111111111111111111111111111

    1. 计算机打印的是原码,所以补码1,1111111111111111111111111111111

      打印出来为-1.

2. static

  1. static修饰全局变量,使得这个全局变量只能在自己所在的源文件内部可以使用,其他源文件不能使用!
  2. 全局变量,在其他源文件内部可以被使用,是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量。

3. 分模块编写程序

我们建议将函数的声明放在头文件中,函数的定义放在源文件中,假设编写加法函数,则需要建立add.h头文件和add.c源文件

add.h文件中存放函数的声明:

 int Add(int x,int y);
复制代码

add.c文件存放函数的定义:

 int Add(int x,int y)
 {
     return x+y;
 }
复制代码

然后在主程序中包含add.h文件,然后使用即可:

 #include <stdio.h>
 #include "add.h"
 ​
 int main()
 {
     printf("%d",Add(3,2));
     return 0;
 }
复制代码

4. 静态库(.lib)生成与使用

加入程序员A要卖给程序员B减法函数Sub(),但是又不想暴露源码给B,于是A将程序生成了为静态库:

  1. 右击“解决问题方案”,选中最下面的“属性”

    Snipaste_2021-09-19_16-01-43.png

在“配置属性”中“配置类型”选中“静态库(.lib)”,然后点应用并确定。

Snipaste_2021-09-19_16-03-40.png

ctrl+F5生成一下。在程序的上一层目录可发现“Debug”文件夹,静态库就在此文件夹中。

Snipaste_2021-09-19_16-07-20.png

然后程序员B在程序中包含Sub.h文件,并在主程序中导入静态库即可:

Snipaste_2021-09-19_16-08-18.png

\

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享