目录
  • 前言
  • 一、关于关键字static
    • 1.static修饰局部变量
    • 2.static修饰全局变量
    • 3.static修饰函数
  • 二、sizeof和strlen的区别
    • 1.sizeof
    • 2.strlen
    • 二者区别
  • 三、关于if()内部>与<的正确使用

    前言

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

    一、关于关键字static

    在C语言中:

    static是用来修饰变量和函数的

    • 修饰局部变量-称为静态局部变量
    • 修饰全局变量-称为静态全局变量
    • 修饰函数-称为静态函数

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

    1.static修饰局部变量

    //第一组代码
    #include <stdio.h>
    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 <stdio.h>
    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("%d\n", g_val);//2018
        return 0;
    }
    //代码2
             //add.c
    static int g_val = 2018;
             //test.c
    int main()
    {
        printf("%d\n", 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("%d\n", Add(2, 3));//  5
        return 0;
    }
    //代码2
          //add.c
    static int Add(int x, int y)
    {
        return c+y; 
    }
          //test.c
    int main()
    {
        printf("%d\n", Add(2, 3));//报错
        return 0;
    }

    代码一:输出 5

    代码二:在编译的时候会出现连接性错误

    所以一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

    二、sizeof和strlen的区别

    我们首先必须知道sizeof是关键字!!

    strlen是函数!! 两者有着质的区别

    1.sizeof

    在c语言中,sizeof在头文件中的类型为unsigned int ,

    他的参数可以是指针、数组、类型、对象、函数等等

    2.strlen

    在c语言中,strlen()是函数,所以在使用它的时候,就有对应的头文件 <string.h> ,他和sizeof在参数上不同的是,strlen的参数只有字符型指针。

    二者区别

    二者计算指针长度

    众所周知字符串数组后面会默认有 ‘\0’ ,下面我们用代码来看看二者的区别

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char arr[] = { "abcd" };
    	printf("%d\n", sizeof(arr));//   5
    	printf("%d\n", strlen(arr));//   4
    	return 0;
    }
    

    sizeof遇到 ‘\0’ 时会将 ‘\0’ 算入

    strlen从第一个地址开始遍历,遇到 ‘\0’ (NULL)会立刻返回,但是返回的长度并不包括 ‘\0’

    因此 sizeof在字符串数组内返回的长度总是比strlen多一个

    下面我们用代码来解释sizeof和stlen的不同

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

    C语言中static与sizeof查缺补漏篇

    C语言中static与sizeof查缺补漏篇

    C语言中static与sizeof查缺补漏篇

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

    首先我们来看一道题目

    C语言中static与sizeof查缺补漏篇

    我相信大家刚开始看到这道题目的时候一定和我一样不理解,字符 ‘c’ 不是比字符 ‘m’ 小吗,这样打印出来的不应该是no吗,可是为什么打印出来的是yes呢?

    我们是这样解释的:在c语言中,编译器都是从左到右依次判断,因此编译器会先判断字符 ‘c’ 是否比字符 ‘m’ 大,显而易见是假的,因此前面就变成了0,表示假,然后就会判断0是否比字符 ==‘z’==小,显而易见 0比 ==‘z‘==小,因此if语句里面的就是真的,所以我们会打印出 yes。

    但是怎样才会打印出我们想要的结果呢?看下面的代码

    C语言中static与sizeof查缺补漏篇

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

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。