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

C语言的相关问题解答

  • 写在最前面
  • 问题一:代码缩进
  • 问题二:C语言中的变量作用域
    • 变量作用域
    • 静态变量
    • 总结
  • 问题三:变量名和函数名重名
    • 相关解析
      • 变量 `sum`
      • C 语言中,`sum` 并不是一个内置的函数名或保留字
      • 变量名和函数名重名?
      • 总结

写在最前面

一位粉丝私信交流,回想起了当初的我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 内部可见
    }
    
  2. 全局作用域

    • 全局变量在所有函数之外声明,通常在文件的顶部。
    • 它们在整个程序中都是有效的,可以被任何函数访问和修改。
    • 全局变量在程序开始执行时分配内存,并在程序结束时释放。
    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,因此不会发生重名冲突。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle中mybatis批量更新报错ORA-00933:SQL命令未正确结束

项目场景&#xff1a; 最近在开发项目的过程中遇见了这个问题&#xff1a;Oracle中批量更新的时候报错 ORA-00933&#xff1a;SQL命令未正确结束 问题描述 mybatis批量更新报错ORA-00933&#xff1a;SQL命令未正确结束 <foreach item"item" index"index&q…

【TinyALSA全解析(三)】tinyplay、tincap、pcm_open源码解析

tinyplay、tincap、pcm_open源码解析 一、本文的目的二、tinyplay.c源码分析三、tinycap.c源码分析四、pcm.c如何调度到Linux Kernel4.1 pcm_open解析4.1.1 pcm_open的主要流程4.1.2 流程说明4.1.3 调用方法 4.2 pcm_write解析 /*********************************************…

图解系列--HTTPS,认证

确保 Web 安全的HTTPS 1.HTTP 的缺点 1.1.通信使用明文可能会被窃听 加密处理防止被窃听 加密的对象可以有这么几个。 (1).通信的加密 HTTP 协议中没有加密机制&#xff0c;但可以通过和 SSL&#xff08;Secure Socket Layer&#xff0c;安全套接层&#xff09;或TLS&#xff…

android 特殊权限处理

运行时权限之特殊权限android.permission.SYSTEM_ALERT_WINDOW 以下为特殊权限的一种申请写法(android.permission.SYSTEM_ALERT_WINDOW) 在做双屏异显功能时,需要使用到Presentation, 使用Presentation需要android.permission.SYSTEM_ALERT_WINDOW权限, 于是就使用谷歌的权限框…

猜-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;猜 作者&#xff1a;harry 提示&#xff1a; 解题附件&#xff1a;flag格式key{图中人物名字全拼} 解题思路&#xff1a; 这......头都没有&#xff0c;让我guess&#xff1f;&#xff1f;&#xff1f;详细信息看…

NASM安装和结合nodepad++进行编译的过程

mov ax,0x30 mov bx,0xc0 add ax,bx times 502 db 0 db 0x55 db 0xAA nasm安装地址: https://www.nasm.us/ 下载exe安装 在命令行提示符输入nasm编译命令 nasm exam.asm -f bin -o exam.bin 此时输入回车将会执行编译过程。 1&#xff0c;启动NotePad&#xff0c;在菜单上选…

web前端tips:js继承——寄生组合式继承

上篇文章给大家分享了 js继承中的 寄生式继承 web前端tips&#xff1a;js继承——寄生式继承 今天给大家分享一下 js 继承中的 寄生组合式继承 寄生组合式继承 寄生组合式继承是一种结合了寄生式继承和组合式继承的方式&#xff0c;它的目标是减少组合式继承中多余的调用父…

【Java 并发编程】进程线程、lock、设计模式、线程池...

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从入门到入坟 Java 并发编程 并发编程多线程的入门类和接口线程组和线程优先级线程的状态及主要转化方法线程间的通信重排序和 happens-beforevolatilesynchronized 与锁CAS 与原子操作AQS计划任务Stream 并行计…

开放式耳机哪个品牌好用?超好用的耳机推荐,新手小白必看

在当今数不胜数的音频品牌中&#xff0c;寻找一款优秀的开放式耳机成为了许多音乐爱好者和新手小白的共同关注点&#xff0c;开放式耳机以其通透的音质和舒适的佩戴感受受到了广泛好评&#xff0c;但市场上的选择却让人眼花缭乱&#xff0c; 为了帮助新手小白在这个耳机的海洋…

从零开始:打造自己的抖音核销工具小程序

对于商家而言&#xff0c;如何高效核销活动中的抖音优惠券成为一项挑战。在这篇文章中&#xff0c;我们将探讨如何从零开始&#xff0c;打造一个个性化、高效的抖音核销工具小程序。 第一步&#xff1a;明确需求和目标 在动手之前&#xff0c;我们需要明确自己的需求和目标。…

ICC2:使用analyze_lib_cell_placement检查lib cell的pass rate

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 在place之前需要使analyze_lib_cell_placement命令去检查lib cell在当前的site row/power plan/legalize设置的环境下能够正常place和legalize。 下面分享一个脚本去报告pass rate低于2%的lib cell…

【Amazon】安装Cloudwatch代理监控EC2

文章目录 一、实验概要二、实验操作步骤2.1 创建 CloudWatch 代理运行角色2.2 安装 CloudWatch 代理软件包2.3 使用 CloudWatch代理收集指标2.4 CloudWatch指标收集确认 三、参考链接 一、实验概要 使用 CloudWatch 代理从 Amazon EC2 实例和本地服务器中收集指标、日志和跟踪信…

在SpringBoot中使用定时任务注解实现简单的定时任务

定时任务&#xff0c;其实在我们开发过程中经常会碰到的一个场景&#xff0c;比如&#xff0c;我现在想要给某些用户定时的发送一些短信呀&#xff0c;邮件呀什么的&#xff0c;也可以用来定时的检查或者监测我们对一些参数的处理。玩的花的可以用来帮我我们进行网页签到&#…

前端:实现div元素选中与不可选中

默认情况下&#xff0c;div元素是可以选中的&#xff0c;但如果需要设置为不可被选中&#xff0c;可以设置为&#xff0c;如下&#xff1a; div {user-select: none; } 如果希望在某些情况下允许选择&#xff0c;可以在需要的地方覆盖这个样式。例如&#xff1a; div.allow…

AI模特换装的前端实现

本文作者为 360 奇舞团前端开发工程师 随着AI的火热发展&#xff0c;涌现了一些AI模特换装的前端工具&#xff08;比如weshop网站&#xff09;&#xff0c;他们是怎么实现的呢&#xff1f;使用了什么技术呢&#xff1f;下文我们就来探索一下其实现原理。 总体的实现流程如下&am…

笔记二十六、React中路由懒加载的扩展使用

26.1 在路由中配置懒加载 lazy routes/index.jsx 代码 import {Navigate} from "react-router-dom"; import Home from "../components/Home"; import About from "../components/About"; // import Classify from "../components/Home/c…

自动化测试框架搭建步骤教程

说起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测试…

CAD精品Eyeshot Fem 2023.3.630 -2023-11-05 Crack

2023.3.630 更新25天前 分享 跟随还没有人关注 改进的 Brep.TransformBy() 方法修复了工具栏内存泄漏修复了 glTF 材质导出期间的异常改进了 glTF 材质金属粗糙度设置修复了渐进式绘图和剪辑平面的错误在 Workspace.UseShaders 属性设置器中添加了缺少的 RenderContext.MakeCur…

Linux基础操作一:连接Linux

1、连接方式 1.1、SSH连接 SSH是Secure Shell的缩写&#xff0c;用于加密远程连接和文件传输的协议。可以使用SSH连接到远程Linux服务器以及在本地访问Linux计算机。SSH连接可以用于执行命令或者上传或下载文件。 – 在Linux命令行中使用SSH连接&#xff1a;可以使用命令ssh…

2024中国眼博会,全国眼康与眼镜品牌加盟展会,北京眼健康展

立足北京&#xff0c;面向全球&#xff0c;2024第六届CEYEE中国眼博会&#xff0c;将以大规模的展览面积在4月与您相会&#xff1b; ——春天是万物复苏的季节&#xff0c;更是企业开拓市场&#xff0c;抓住春季发展机遇的重要时节&#xff1b;第六届CEYEE中国眼博会将在2024年…