【新手解答7】深入探索 C 语言:代码缩进 + 变量作用域、静态变量 + 变量名和函数名重名

简介: 【新手解答7】深入探索 C 语言:代码缩进 + 变量作用域、静态变量 + 变量名和函数名重名


写在最前面

一位粉丝私信交流,回想起了当初的我C语言一题写一下午的,而且很多概念糊糊的不清楚。借助这次机会,整理了相关 C 语言中最常见而关键的疑惑,并对概念进行解答。

本篇博客的前身:

【新手解答1】深入探索 C 语言:变量名、形参 + 主调函数、被调函数 + 类和对象 + 源文件(.c 文件)、头文件(.h 文件)+ 库

【新手解答2】深入探索 C 语言:变量名、变量 + 函数声明 vs 函数定义 + main的声明 + 头文件和源文件的关系

【新手解答3】深入探索 C 语言:头文件提供必要的接口、源文件保持实现细节的私有性 + 进一步学习的方向 + 如何快速编写程序并最终能制作小游戏

【新手解答4】深入探索 C 语言:全局变量声明、全局函数声明 + 宏定义

【新手解答5】深入探索 C 语言:宏中的文本、标识符和字符串 + 递归运算、条件语句、循环 + switch-case 与多项条件和枚举的差别

【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于namespace + import vs include

如有不对的地方欢迎指出!好久没接触C了hh

问题一:代码缩进

【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于namespace + import vs include提到的实例中,这每行之前的空格又有什么讲究呢?

我发现在int main后面,跟的代码块必须与main平齐,而这个显然是空了四格,那有没有什么普遍点的规律?

switch (expression) {
    case value1:
        // 代码块
        break;
    case value2:
        // 代码块
        break;
    // 更多 cases...
    default:
        // 默认代码块
}

问题二:C语言中的变量作用域

对了,C语言中的前缀指的是public那类的吗?还有可否细说一下变量作用域?

在 C 语言中,“前缀” 并不像在一些其他语言(如 Java 或 C#)中那样指代访问修饰符(如 publicprivate 等)。C 语言作为一种过程式编程语言,并没有内置类和访问修饰符的概念。

在 C 语言中,提到的“前缀”通常是指变量或函数名之前的一段标识性文本,用于区分不同模块或库中的同名变量或函数。

变量作用域

在 C 语言中,变量的作用域决定了在哪个部分的代码中可以访问该变量。主要有两种类型的作用域:

  1. 局部作用域
  • 局部变量在函数或块(大括号 {} 内)中声明。
  • 它们只能在声明它们的函数或块中被访问和修改。
  • 每次调用函数时,都会为局部变量分配内存,并在函数执行完毕时释放。
void function() {
    int localVar = 5; // 局部变量,仅在 function 内部可见
}
  1. 全局作用域
  • 全局变量在所有函数之外声明,通常在文件的顶部。
  • 它们在整个程序中都是有效的,可以被任何函数访问和修改。
  • 全局变量在程序开始执行时分配内存,并在程序结束时释放。
int globalVar = 10; // 全局变量,整个程序中都可见
void function() {
    globalVar = 15; // 可以访问和修改全局变量
}

静态变量

静态变量(使用 static 关键字声明)是一种特殊类型的变量,它结合了局部变量和全局变量的某些特性:

  • 静态局部变量:在函数内部声明,但它的生命周期贯穿整个程序执行期间。它只在第一次调用函数时初始化,并在随后的函数调用中保持其值。
  • 静态全局变量:在所有函数之外声明,但只在定义它的文件内有效。它可以防止变量名在其他文件中被访问,从而提供了一种封装。

总结

  • C 语言中没有类似于 publicprivate 这样的访问修饰符。
  • 变量作用域在 C 语言中非常重要,它定义了变量的可见性和生命周期。
  • 局部变量仅在声明它们的函数或块中有效,而全局变量在整个程序中都有效。
  • 静态变量具有特殊的生命周期和作用域特性。

问题三:变量名和函数名重名

sum好像是数组求和的函数吧,但这里的应用好像并不符合它的调用条件啊

哦,对了sum还有对一组数值求和的操作的意思

等等,这个sum可能是变量?但是这样的话……变量和函数名都是标识符,会不会重名什么的?

实例:计算数组中正数的总和

假设我们有一个整数数组,我们想计算数组中所有正数的总和。

#include <stdio.h>
int main() {
    int numbers[] = { -1, 3, 4, -5, 9, -2 };
    int sum = 0;
    for (int i = 0; i < sizeof(numbers) / sizeof(numbers[0]); i++) {
        if (numbers[i] > 0) {
            sum += numbers[i];
        }
    }
    printf("Sum of positive numbers: %d\n", sum);
    return 0;
}

相关解析

【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于namespace + import vs include提到的实例中,sum 实际上是一个变量的名字,而不是函数名。它被用来累加数组中的正数,最终存储正数的总和。

变量 sum

在这段代码中,sum 被初始化为 0。然后,通过 for 循环遍历数组 numbers,每当遇到一个正数时,就将这个数加到 sum 上。这个过程中,sum 变量累积了数组中所有正数的总和。

C 语言中,sum 并不是一个内置的函数名或保留字

在标准的 C 语言中,sum 并不是一个内置的函数名或保留字。C 语言标准库中没有名为 sum 的函数。如果你在 C 代码中看到 sum,它很可能是程序员自定义的一个变量名或者函数名。

C 语言标准库提供了一系列的函数,但都是围绕字符串处理、数学计算、输入输出、时间日期处理等功能。对于求和这样的操作,通常需要程序员自己实现。

例如,在这个的代码示例中,sum 被用作一个变量名,用于累加数组中的正数。这是程序员定义的变量,而不是 C 语言的内置函数。在 C 中,执行求和操作通常需要通过循环或递归等方法来手动计算。

变量名和函数名重名?

在 C 和 C++ 中,变量名和函数名都是标识符。确实有可能出现重名的情况,但在函数和变量的作用域不重叠的情况下,这通常不是问题。

  • 局部作用域:在函数内部定义的变量(如 sum)只在该函数内部有效,这称为局部作用域。
  • 全局作用域:在所有函数外部定义的变量具有全局作用域,它们在整个程序中都是有效的。
  • 函数名:函数名的作用域取决于它的声明位置。通常,函数可以在文件中的任何位置被调用(除非它被声明为 static,这样它就只能在定义它的文件中被调用)。

在这个代码示例中,sum 是一个局部变量,只在 main 函数内部有意义。除非你在同一个作用域内定义了一个名为 sum 的函数,否则不会有重名的问题。

总结

在这个代码实例中,sum 是用来累加正数的一个局部变量。在 C 和 C++ 中,变量名和函数名都是标识符,它们可以同名,但只要它们的作用域不重叠,就不会有冲突。这段代码没有函数名为 sum,因此不会发生重名冲突。


希望这些解释能够帮助你更好地理解这些概念。如果还有疑问,欢迎继续提问交流!

目录
相关文章
|
2月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
60 4
|
27天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
48 12
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
38 5
|
2月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
67 1
|
3月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
60 1
|
3月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
3月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
3月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)