网站建设公司做销售前景好不好,河南智慧团建网站登录,电子商务平台搭建方案,农村电商平台发展现状Static
static修饰局部变量改变了变量的生命周期#xff0c;让静态局部变量出了作用域依然存在#xff0c;到程序结束#xff0c;生命周期才结束。
static 修饰局部变量 改变局部变量的生命周期#xff0c;本质上是改变了局部变量的存储位置#xff0c;让局部变量不再是…Static
static修饰局部变量改变了变量的生命周期让静态局部变量出了作用域依然存在到程序结束生命周期才结束。
static 修饰局部变量 改变局部变量的生命周期本质上是改变了局部变量的存储位置让局部变量不再是在栈区上开辟空间而是直接在静态区上开辟空间从而使得局部变量拥有和全局变量一样的生命周期即随着整个程序生成和销毁。 在编译环节的编译阶段编译器就会为被 static 修饰的局部变量分配空间所以C程序在运行的过程中会直接跳过 static 修饰的语句也就是说在第二次及以上甚至第一次调用 test 函数时 static int a 0; 这条语句都不会被执行。
static修饰全局变量 改变了全局变量的外部链接属性(可以在其他源文件内被访问)使其变成内部连接属性(只能在本文件内部被访问)给我们的感觉是全局变量的作用域变小了。
static修饰函数 改变了函数的外部链接属性(可以在其他源文件内被访问)使其变成内部连接属性(只能在本文件内部被访问)给我们的感觉是函数的作用域变小了。
参考https://blog.csdn.net/m0_62391199/article/details/123517767
Const
const修饰的全局变量为只读其值不可修改。如果在程序中企图对const修饰的变量进行修改那么程序就会报错。 const 是 constant 的缩写是恒定不变的意思也翻译为常量、常数等。很不幸正是因为这一点很多人都认为被 const 修饰的值是常量。这是不精确的精确的说应该是只读的变量其值在编译时不能被使用因为编译器在编译时不知道其存储的内容。 const 推出的初始目的正是为了取代预编译指令消除它的缺点同时继承它的优点define 不是关键字。 const 修饰变量 用 const 修饰的变量被称为常变量说 const 定义的是变量但又相当于常量说它定义的是常量但又有变量的属性所以叫常变量。其作用是给该变量赋上只读属性使该变量不可直接被修改。但是我们仍然可以通过指针的方式来间接修改变量的值也就是说const 修饰变量使变量的值不能被修改这一属性并不是绝对的它只是编译器层次上的保证。 1、它可以让编译器在编译代码时对于用 const 修饰的变量直接进行语法检查使我们提前发现对一些不应该被直接修改的变量被直接修改而引起的错误最大的作用。 2、让该变量具有自身描述性相当于告诉其他的程序员不要直接修改该变量。
const 修饰数组 给该数组赋上只读属性使该数组中的每个元素都不可直接被修改只读数组。和 const 修饰变量一样
const 修饰指针 1、const 放在类型名int*前表示指针指向的变量不能直接被修改指针的指向可以被修改。
const int *p a;
int const *p a;const 放在 int 前面和 int 后面都是放在了类型int*的前面所以二者的效果是完全一样的但是建议将 const 放在 int 前面。
2、const 放在类型名int*后面表示指针的指向不能直接被修改指针指向的变量可以直接被修改。
int * const p a;当 const 放在类型名后面时p指向的内容可以直接被修改掉但是不能直接修改p的指向。 3、const 同时放在类型名int*前面和后面表示指针指向的变量和指针的指向都不能被直接被修改。
const int * const p a;const 修饰函数 1、const 修饰函数参数表示在其函数内部不能对该参数直接进行修改。 2、const 修饰返回值表示该函数返回值不能直接被修改。
参考https://blog.csdn.net/m0_62391199/article/details/123686916
Volatile
volatile是一个类型修饰符作用是作为指令关键字一般都是和const对应确保本条指令不会被编译器的优化而忽略。
在某些情况下为了提高效率CPU会直接将 flag 放在寄存器中以后CPU每次检测时直接从寄存器中读取 flag 的值不再从内存中读取这种情况也被称为 “内存覆盖”。
当存在直接对内存进行操作的动作例如其他线程修改了内存中flag 的值因为CPU是直接从寄存器中读取 flag 的值进行 while 循环的逻辑判断的所以当另一个逻辑将 flag 改为0时while 循环并不会停止而是会继续执行其中的代码块从而造成程序逻辑上的错误。
那么为了在某些特殊的情况下出现上述的问题我们应该怎么办呢我们可以直接在 flag 变量前面加上 volatile 关键字让CPU不要对 flag 进行优化每次都继续从内存当中读取 flag 的值。
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int main()
{volatile int flag 1;while (flag) {;}return 0;
}这就是 volatile 关键字修饰变量的作用让编译器不对被 volatile 修饰的变量进行优化从而达到稳定访问内存的目的。 注意虽然 volatile 叫做易变关键字但这里仅仅是描述它修饰的变量可能会变化要编译器注意并不是要求被它修饰的变量必须 变化这点要特别注意。 参考https://blog.csdn.net/m0_62391199/article/details/123746218?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167660003416782428674580%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id167660003416782428674580biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-123746218-null-null.blog_rank_defaultutm_termVolatilespm1018.2226.3001.4450