华为 1.static有什么用途?(请至少说明两种)

1.static有什么用途?(请至少说明两种)

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

以上是c的内容,对于c++请看以下三个示例之后的部分!!!

1)示例:

static的第一个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

 1 #include<stdio.h>
 2
 3 int fun(void)
 4 {
 5     static int count = 10; //事实上此赋值语句从来没有执行过
 6     return count--;
 7 }
 8
 9 int count = 1;
10
11 int main(void)
12 {
13     printf("global\t\tlocal static\n");
14     for(; count <= 10; ++count)
15         printf("%d\t\t%d\n", count, fun());
16     return 0;
17 } 

程序的运行结果是:

 global local static 

1 10 

2 9 

3 8 

4 7 

5 6 

6 5 

7 4 

8 3 

9 2 

10 1 

参考转自:http://wenku.baidu.com/link?url=GeR-U21HvIYGnuF1xmCEmf-SzR6R-Nfj8x2_RRxXi-NfDPN39XGNWpwGrVTZbyb-_osre3Y89lKfoAiKqWEgX86umsjLfBzxCcDqDkPpkou

2)示例:

它的第二条也是最重要的一条:隐藏。 
    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容

1 char a = ‘A‘; // global variable
2 void msg()
3 {
4  printf("Hello\n");
5 }

下面是main.c的内容

1 int main(void)
2 {
3     extern char a; // extern variable must be declared before use print
4     f("%c ", a); 
5     (void)msg();
6     return 0;
7 }

程序的运行结果是: A Hello 
   你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。 
   如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有其他两个作用。

3)示例:

static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。

如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加&rsquo;\0&rsquo;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是&rsquo;\0&rsquo;。

不妨做个小实验验证一下。

1 #include <stdio.h>
2 int a;
3 int main(void)
4 {
5     int i;
6     static char str[10];
7     printf("integer: %d; string: (begin)%s(end)", a, str);
8     return 0;
9 } 

程序的运行结果如下

integer: 0; string: (begin)(end) 
    最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

以下转自:http://blog.csdn.net/leo115/article/details/8085414

面试题:static有什么作用?

答:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数

一、       定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

(1)       在全局数据区内分配内存

(2)       如果没有初始化,其默认值为0

(3)       该变量在本文件内从定义开始到文件结束可见

二、       定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

(1)       该变量在全局数据区分配内存

(2)       如果不显示初始化,那么将被隐式初始化为0

(3)       它始终驻留在全局数据区,直到程序运行结束

(4)       其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

三、       定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点:

(1)       静态函数只能在本源文件中使用

(2)       在文件作用域中声明的inline函数默认为static

说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在文件坐在的编译单位内使用,不能呢个在其他编译单位内使用。

在C++语言中新增了两种作用:定义静态数据成员或静态函数成员

(1)       定义静态数据成员。静态数据成员有如下特点:

(1)       内存分配:在程序的全局数据区分配

(2)       初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义

(3)       静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,主要用于对静态数据成员的操作。

(4)       静态成员函数和静态数据成员都没有this指针。

时间: 2024-08-24 09:05:59

华为 1.static有什么用途?(请至少说明两种)的相关文章

网络操作系统按结构可以分为“对等结构操作系统”和“非对等结构操作系统”,请对这两种结构操作系统的主要特点给以简要说明。

对等结构的网络操作系统是指网络中的各个结点地位平等,因此安装在每个结点的操作系统的功能也相同,网络中的各种资源都可以实现共享.非 对等结构的网络操作系统根据功能的不同,将网络中的结点分为服务器和工作站两类,服务器用于提供网络服务和资源,工作站用于本地用户进行信息处理,通过访问服务器获得网络服务. 原文地址:https://www.cnblogs.com/aikeming/p/11674750.html

基于华为交换机的局域网中交换机管理IP配置的两种参考方法

对于规模不大的小型局域网而言,通常没有配备对网络设备进行统一管理的系统.交换机.路由器等网络设备的管理处于离散状态,对这些设备的管理通常也是一对一的管理.在用户对网络要求不高的情况下,如接入计算机设备数少,也不在意广播等对网络性能造成的影响等等,这种情况只要在核心交换机上做简单配置把计算机等接入设备放在一个VLAN中就可以了.但是,随着接入设备的增加,这种情况的网络性能会越来越差,更不用谈网络的管理.网络的安全了.近几年,随着网络安全问题的日益突出,用户网络安全意识的加强,更多的用户开始慢慢地对

密码等级:至少包含字母、大小写数字、字符中的两种 JS实现方案

前言 密码,如果设置的太简单,很容易就被攻破,所以很多网站将密码设置的要求设置的挺严格,一般是字母.数字.字符3选2,区分大小写.对于设置得太简单的密码,予以错误提示.或者予以密码等级(低中高)显示,让用户设置高级密码.那如何利用JS实现呢? 代码 链接:https://gist.github.com/xuanfeng/a44f20cb4569d5b4cd5e 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

SPOJ 220后缀数组:求每个字符串至少出现两次且不重叠的最长子串

思路:也是n个串连接成一个串,中间用没出现过的字符隔开,然后求后缀数组. 因为是不重叠的,所以和POJ 1743判断一样,只不过这里是多个串,每个串都要判断里面的最长公共前缀有没有重叠,所以用数组存下来就得了,然后再判断. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #in

hdu 4521 小明系列问题——小明序列 (间隔至少为d的LIS 两种解法)

先附上资源地址:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工

求一个int型整数的两种递减数之和(java)--2015华为机试题

题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况. 最大递减数:所输入整数的所有递减数中值最大的一个. 如: 75345323,递减数有:75,753,53,53,532,32.那么最大的递减数为753. 各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7

创业初期请避开这10种错误

很多创业者有绝妙的创意,但仍会面临很多复杂的问题,例如如何管理企业,如何处理财务问题以及如何雇用员工等.这里有10种你要避免的错误. 创业是很困难的,创建创业公司更具挑战性.除了要面临从零开始建立一家公司的挑战,许多创业者还缺乏商业领域的经验.即使他们有令人难以置信的绝妙的创意,仍然会面临很多复杂的问题,例如如何管理年轻的企业,如何处理财务问题以及如何雇用员工,如何避免不必要的开支等等. 由于缺乏经验,许多初创公司失败了--当然前提是他们真的创建了公司.为了确保这些灾难故事不再增加,这里有10种

validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblank = /^\S*$/; return this.optional(element) ||(pwdblank.test(value)); }, "密码不可包含空格"); //用户名必须需包含数字和大小写字母中至少两种 jQuery.validator.addMethod("use

C语言中数据的两种属性及static的作用

C语言中数据有两种属性:数据类型和存储类别.数据类型定义了数据格式(长度),存储类别定义了数据的作用域和生命期. 1.变量的声明 1.1 变量的声明的一般形式:存储类别 数据类型 变量名;数据类型以int为例: 自动变量:auto int i;//自动变量是局部变量 局部变量:在函数内部定义的变量,局部变量缺省存储类别时就是自动变量 作用域:从定义开始到函数结束. 生命期:从函数调用开始到函数推出为止. 外部变量/全局变量:在函数外部定义而没有指出存储类别的变量 定义外部变量:extern in