惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
I
InfoQ
The Register - Security
The Register - Security
L
LangChain Blog
H
Help Net Security
The GitHub Blog
The GitHub Blog
S
Schneier on Security
博客园 - 【当耐特】
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
IT之家
IT之家
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
H
Heimdal Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
雷峰网
雷峰网
N
Netflix TechBlog - Medium
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - 聂微东
PCI Perspectives
PCI Perspectives
Last Week in AI
Last Week in AI
A
Arctic Wolf
宝玉的分享
宝玉的分享
T
The Blog of Author Tim Ferriss
S
Secure Thoughts
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
SecWiki News
SecWiki News
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AI
AI
Engineering at Meta
Engineering at Meta

洛屿的小站

STM32F407 IAR环境下uC/OS-III移植完整指南 STM32 UCOS3+HAL库集成中的FPU HardFault问题 一种简单的卡尔曼滤波器设计 Cadence - 应律而动,落指成音 Zephyr - 聆风之息,为你而奏 不改一行插件代码,实现消息优先级与阻断 洛玖定时任务系统 在 butterfly 主题中添加首页点集动画(基于p2line项目) 你好,2026 stm32f4xx-ads1256驱动 stm32f4xx-ad9854并行驱动 主动式网站状态监测实现及其应用 右键菜单加入用Trae打开文件和文件夹 三角洲行动ID映射表 洛玖SDK说明 为网页文章开头添加原文连接 Hexo-Butterfly主题在主页添加GitHub贡献日历 Proteus中555定时器仿真问题 装饰器 洛玖开发日记 STS3032舵机获取力矩输出 kotlin网页前后端那些事 mspm0g3507-ad9850 奇怪的bug Paddle模型转PaddleLite 人工智能考核 构建一个yolov3网络 yolo和paddle模型常见输出参数 PaddleDetection 随便写的一些东西 实验室C语言第一次考核题目讲解及相关代码解读 C语言神经网络房价预测系统 C、C++数组,指针,指针数组,数组指针的区别 C、C++的大括号是必须的部分吗? C、C++预处理详解 C、C++其他关键字详解 C、C++控制语句关键字详解 C、C++数据类型关键字详解 C、C++关键字 C++药品管理系统 Bi-LSTM(Attention)的PyTorch实现 C语言实现波士顿房价预测 easy库的使用 edgeboardFZ3A相关问题 Predict.py的编写 Paddle环境搭建 百度Paddle模型训练 GMD09601-0.96OLED显示屏 【LeetCode 1617】统计子树中城市之间最大距离 C语言学习相关 STM32阵列按键 CH32(F10X F20X) 最短路 拓扑排序
C、C++存储类型关键字详解
洛屿 · 2023-10-10 · via 洛屿的小站

存储类型关键字

auto

  • auto 是默认的存储类别关键字,它用于定义自动变量。
  • 自动变量的生命周期仅限于定义它们的代码块,当代码块执行结束时,它们会被销毁。

示例代码(记作代码1):

1
2
3
4
5
6
7
8
#include <stdio.h>

int main() {
auto int x = 10; // 可以省略 "auto",因为它是默认的存储类别
printf("x: %d\n", x);
// x 的生命周期仅限于 main 函数
return 0;
}

在上方代码1中,auto int x = 10;int x = 10;是等效的:

这是因为 int x = 10; 默认就是一个自动变量,编译器会根据上下文自动识别它为自动变量。

同样,例如下方代码(记作代码2):

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
auto int x = 10; // 可以省略 "auto",因为它是默认的存储类别
printf("x: %d\n", x);

auto y = x; // 使用auto类型定义变量y
printf("y: %d\n", y);

return 0;
}

当你写 auto y = x; 时,编译器也会将 y 类型设置为 int,因为 xint 类型,所以 y 也被赋予了相同的类型。

C语言的类型系统会根据右侧表达式的类型来确定左侧变量的类型,这就是类型推断。

因此,在代码2中,y 被推断为 int 类型,与 x 相同。

extern

  • extern 用于声明一个全局变量,它表明该变量在当前文件中并没有被定义,而是在其他文件中定义的
  • 这允许多个文件共享同一个全局变量,该变量可以被多个文件调用,并修改其值。

示例代码(extern使用时,对应着多文件场景):

文件1.c:

1
int globalVar; // 定义全局变量

文件2.c:

1
2
3
4
5
6
#include <stdio.h>
extern int globalVar; // 声明全局变量,以便在其他文件中使用
int main() {
printf("globalVar: %d\n", globalVar);
return 0;
}

register

  • register 用于请求编译器将变量存储在CPU寄存器中,以加快对变量的访问速度。
  • 这是一个建议(编译阶段请求将register存储在CPU寄存器中),编译器可能会忽略它,特别是在如今的编译器中(因为如今的编译器已经非常智能,它们能够更好地管理寄存器分配,从而提高代码的性能,通常来说,如今的编译器比程序员更了解如何优化代码)。

示例代码:

1
2
3
4
5
6
7
#include <stdio.h>

int main() {
register int i = 5; // 请求将变量 i 存储在寄存器中
printf("i: %d\n", i);
return 0;
}

static

  • static 用于改变变量的存储期和可见性。
  • 在函数内部使用 static 声明的变量具有持久的存储期,而在如今的使用 static 声明的变量只在当前文件中可见

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void demo() {
static int count = 0; // 持久性的局部变量
count++;
printf("count: %d\n", count);
}

int main() {
demo(); // 输出 count: 1
demo(); // 输出 count: 2
return 0;
}

如果上述代码不加static

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void demo() {
int count = 0; // 持久性的局部变量
count++;
printf("count: %d\n", count);
}

int main() {
demo(); // 输出 count: 1
demo(); // 输出 count: 1
return 0;
}

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 洛屿的小站

打赏

  • wechat

    wechat

  • alipay

    alipay