栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

关于【static】【sizeof】等等 我到底了解了多少------一篇记录我困惑地方的随笔

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于【static】【sizeof】等等 我到底了解了多少------一篇记录我困惑地方的随笔

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
  • 一、关于关键字static
  • 二、sizeof和strlen的区别
    • 二者区别
  • 三、关于if()内部'>' , '<' 的正确使用
  • 总结


前言

`最近学习遇到了很多小难题,今天这篇博客就来记录一下最近学习所遇到的一些困惑我的地方,以便于复习。


一、关于关键字static

在C语言中:
static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

下面我们用代码来解释一下static在c语言中的应用

1.static修饰局部变量

//第一组代码
#include 
void test()
{
    int i = 0;
    i++;
    printf("%d ", i);//1 1 1 1 1 1 1 1 1 1 
}
int main()
{
 int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;

//第二组代码
#include 
void test()
{
    //static修饰局部变量
    static int i = 0;
    i++;
    printf("%d ", i);//1 2 3 4 5 6 7 8 9 10
}
int main()
{
	int i = 0;
	    for(i=0; i<10; i++)
	   {
	        test();
	   }
	    return 0;
}

代码一:输出为 1 1 1 1 1 1 1 1 1 1
代码二:输出为 1 2 3 4 5 6 7 8 9 10
所以static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。 简单来说就是static把原本在栈区上的局部变量挪到了静态区,即 可以使变量出了作用域之后不销毁。

2.static修饰全局变量
在这里我们需要在一个工程里面开辟2个.c文件,方便我们更清晰的看出static的作用

//代码一
       //add.c
int g_val = 2018;
       //test.c
int main()
{
    printf("%dn", g_val);//2018
    return 0;
}


//代码2
         //add.c
static int g_val = 2018;
         //test.c
int main()
{
    printf("%dn", g_val);//会报错
    return 0; }

代码一:输出 2018
代码二:在编译的时候会出现连接性错误
所以我们可以得出结论 :一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

3.static修饰函数
我们也需要在一个工程内开辟2个.c文件方便我们观察

//代码1
     //add.c
int Add(int x, int y)
{
    return x+y;
}
     //test.c
int main()
{
    printf("%dn", Add(2, 3));//  5
    return 0;
}


//代码2
      //add.c
static int Add(int x, int y)
{
    return c+y; 
}
      //test.c
int main()
{
    printf("%dn", Add(2, 3));//报错
    return 0;
}

代码一:输出 5
代码二:在编译的时候会出现连接性错误
所以一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

二、sizeof和strlen的区别

我们首先必须知道sizeof关键字!!
strlen函数!! 两者有着质的区别
1、sizeof
在c语言中,sizeof在头文件中的类型为unsigned int ,
他的参数可以是指针、数组、类型、对象、函数等等
2、strlen
在c语言中,strlen()是函数,所以在使用它的时候,就有对应的头文件 ,他和sizeof在参数上不同的是,strlen的参数只有字符型指针。

二者区别

二者计算指针长度
众所周知字符串数组后面会默认有 ‘’ ,下面我们用代码来看看二者的区别

#include
#include
int main()
{
	char arr[] = { "abcd" };
	printf("%dn", sizeof(arr));//   5
	printf("%dn", strlen(arr));//   4

	return 0;
}

sizeof遇到 ‘’ 时会将 ‘’ 算入
strlen从第一个地址开始遍历,遇到 ‘’ (NULL)会立刻返回,但是返回的长度并不包括 ‘’
因此 sizeof在字符串数组内返回的长度总是比strlen多一个

3、下面我们用代码来解释sizeofstlen的不同

#include
#include
int main()
{
	char arr[] = { 'a','b','c','d'};
	printf("%dn", sizeof(arr));//   4
//一个字符在内存中占一个字节,4个字符就占4个字节,所以输出4
	printf("%dn", strlen(arr));//   15
//因为字符数组并不会默认字符最后有'',所以编译器就会一直往后找,直到找到''
//但是此时''是随机的,这取决于编译器,如果在其他编译器内运行 打印的结果可能就是其他大于4的随机数,下面我有贴图片
    char arr1[]={'a','b','c','d',''};	
    printf("%dn", strlen(arr1));//  4
	return 0;
}


三、关于if()内部’>’ , ‘<’ 的正确使用

首先我们来看一道题目
我相信大家刚开始看到这道题目的时候一定和我一样不理解,字符 ‘c’ 不是比字符 ‘m’ 小吗,这样打印出来的不应该是no吗,可是为什么打印出来的是yes呢?
我们是这样解释的:在c语言中,编译器都是从左到右依次判断,因此编译器会先判断字符 ‘c’ 是否比字符 ‘m’ 大,显而易见是假的,因此前面就变成了0,表示假,然后就会判断0是否比字符 ==‘z’==小,显而易见 0比 ==‘z‘==小,因此if语句里面的就是真的,所以我们会打印出 yes
但是怎样才会打印出我们想要的结果呢?看下面的代码

当我们用 ==&&==这个符号连接时,if语句里面的意思就是 字符’c‘<‘m’ 且字符’c‘>'m’是打印yes,这就是我们想要的结果了。

总结

以上这些就是我在最近学习中遇到的不解,如果还有错误,希望大家可以私信我并指正!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号