常识 4个月前

编程语言
627
常识

1. 全局变量的作用域

全局变量的作用域就是整个工程

我们在同一工程但在不同的源文件这句话是否有误呢?

比如在源文件 test2.c 中我们创建一个全局变量 a = 10

int a = 10

但在不做声名的情况下我们却发现在test1.c中 a 并没有被创建

int main()
{
    printf("%d", a); // error
    return 0;
}

但是全局变量的作用域是整个工程这句话并没有错误

我们只需要在 test2.c 中声明即可

此时我们需要一个函数 extern 使用方法如下

extern int a;
int main()
{
    printf("%d", a); // error
    return 0;
}

2. 什么是常量

创建数组时我们需要为数组提供 创建量(必须为常量)

int main()
{
    int a = 10;
    int arr[a] = { 0 }; // error : a
    return 0;
}

const

const在 * 前 , 修饰的是 *p const在 * 后 , 修饰的是 p

const 只是将 a 从变量修饰成了常量,让其拥有了常属性,但其本质上还是一个变量

const int a = 10;
a = 20; //error 表达式必须是可以修改的左值

int arr[a] = { 0 }; //error, 其本质上还是一个变量

枚举常量

枚举常量即是可以一一列举的量

创建方法如下

enum xxx
{
   a,       //若不赋值默认为0
   b,       //向下逐一递增,b即默认为1
   c = 100, //赋值之后即为100
   d        //逐一递增,默认为101
}

d = 110; //error 并不能改变

3. 常见字符串的创建


常见的字符串创建有以下几种

char arr1[] = "abc";              //实际上该字符串共有4个元素,其末尾会自动补上'\0'作为终止标志
char arr2[] = {'a','b','c','\0'}; //以这种方式创建时必须手动补上 '\0'作为结束标志
char arr3[4] = "abc"              //之所以要标有四个元素个数,是要为 '\0' 留有空间
char arr4[4] = {'a','b','c','\0'}
char arr5[4] = {'a','b','c'}      //此时不加'\0'也没有关系,剩下的元素自动默认为'\0'

那么,加入没有手动加入 '\0' arr2 是否会出问题呢,我们来使用 strlen 这个函数来验证一下

strlen

求长度方式就是计算出字符串 '\0' 前的字符个数(不包括'\0')

char arr[] = { 'a', 'b', 'c'};
printf("%d", strlen(arr)); //42(随机值)

可见没有手动加入 '\0' 之后该字符串的长度是随机值

4. 转义字符

当我们想要打印一个字符 ' 时会有错误

那么究竟该如何做才能打印出一些貌似有功能作用的字符呢 在此我们引出转义字符

转义字符 作用
/' 用于表示字符常量 '
/" 用于表示一个字符串内的双引号
// 用于表示一个反斜杠,防止被解释为一个 转义序列符(即 /n , /r 等解释方向)
/a 警告字符,打印可发出蜂鸣声
/b 退格符
/f 进纸符
/n 换行
/r 回车
/t 水平制表符
/t 水平制表符
/v 垂直制表符
/ddd (d表示随机数字)表示1~3个八进制数字(系统可以将他解读为十进制 比如 /130 系统可以将他解释为十进制的 88
/xdd (/x是头,d是随机数字)表示1~2个十六进制数字

5. static

static修饰局部变量,改变了局部变量的生命周期 ,本质上是改变了变量的存储类型(由栈区变为静态区) static也会使其修饰的全局变量只能在自己所在的源文件内使用,其他源文件不能使用

全局变量在其他源文件内可以使用的原因是其具有外部链接属性 但被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了 static修饰函数时,也会使得函数只能在自己所在的源文件内部使用

6. goto

goto语句不能够跨越函数

void test()
{
   flag:
   printf("aaa");
}
int main()
{
    goto flag; //此时的flag会报错出"未定义flag"
    return 0;
}

6. 随机数(时间戳)的生成

rand

#include<stdilb.h>
int rand(void);

该函数可以生成 0~32767 的整形数

但是,调用该数组生成的虽然确实是一个随机数,但是当你运行第二次时,这个随机数并没有发生变化

即第一次调用和第二次调用得到的值都是一样的

我们引入另外一个函数

srand

调用rand之前,我们需要调用srand来设置这个随机数的生成器

#include<stdlib.h> 
 void srand(unsigned int seed);

但是当我们调用这个函数后并放入一个 unsigned int 整形数后会发现较上次不一样了 调用第二次却发现,数字还是没有变化

再引入一个库函数 time

time函数会返回一个时间戳,返回的时间戳是: 调用这个函数的那个时间点和计算机的起始时间之间的时间戳

#include<time.h>  
time_t time(time_t *timer);    //time_t 本质上是一个整形

而srand需要的类型是 unsigned int 类型,那么强制转换一下

#include<stdlib.h>
#include<time.h>
int main()
{
  srand((unsigned int)time(NULL));
  int ret = rand(); //ret 即是我们需要的随机数
  return 0;
}

最后简单提一下 栈区存储习惯先高地址后低地址

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2222762
累计阅读

热门教程文档

Java
12小节
C++
73小节
爬虫
6小节
Kotlin
68小节
Djiango
17小节