C语言入门系列:变量 —— 存储数据的容器

1. 变量及其作用

想象一下,你正在编写一个程序来记录学生的成绩。你需要一个地方来暂时存放这些成绩,这就是变量的用武之地。

变量不仅可以存储数值,还能保存字符、布尔值等多种数据类型,使你的程序能够处理多样化的信息。

代码示例:存储学生分数

#include <stdio.h>

int main() {
    int studentScore; // 声明一个整型变量来存储学生成绩
    studentScore = 95; // 给变量赋值
    printf("The student's score is: %d\n", studentScore); // 输出变量值
    return 0;
}

2. 变量名

变量名是程序员与计算机沟通的桥梁,它遵循一定的命名规则,确保程序易于阅读和理解。

命名规则

  • ①必须以字母(a-z, A-Z)或下划线 _ 开始。
  • ②不能以数字开头。
  • ③后续可以包含字母、数字(0-9)或下划线。
  • ④不得使用C语言的关键字(如if, else, int等)作为变量名。
  • ⑤建议使用有意义的名称,如age而不是a,以提高代码的可读性。

①~④是必须遵守的C语言规范,⑤是实战中的最佳实践。

关键字
④中提到的关键字,是指C语言中有特殊意义的词,编译器会根据这些词执行对应的编译过程,这些词就像海洋中的灯塔一样,引领着编译器,不能随便使用。

比如编译器会将关键字if后的代码块作为一个整体,其后的代码必须遵循规范,所以其不能作为变量名。

下面的词都是C语言中的关键字。

auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, inline, int, long, register, restrict, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while

关于这些关键字,完全没必要记住。

在这里插入图片描述
在写代码的过程中,如果使用关键字作为变量名,IDE会提示错误。好钢用在刀刃上,让大脑干最重要的活吧。

3. 声明变量

声明变量是告诉编译器为其分配内存空间并指定数据类型的过程。

变量必须先声明后使用,使用未声明的变量,编译时会报错。

在这里插入图片描述

C语言是强类型语言,声明变量必须指定数据类型。

C语言提供了多种基本数据类型,如int, float, char, double等。

示例:声明不同类型的变量

int age;      // 整型变量,用于存储年龄
float height; // 浮点型变量,用于存储身高
char grade;   // 字符型变量,用于存储成绩等级

变量类型一定确定,后续不能改变类型。

4. 变量赋值

赋值操作是将具体值赋予变量的过程。你可以直接在声明时赋值,也可以在之后的程序中进行。赋值操作通过赋值运算符 = 完成。

示例:变量赋值与重新赋值

int score = 85; // 在声明时赋初值
score = 92;    // 之后重新赋值

注意score = 92;是赋值语句,score = 92是赋值表达式,区别在于是否带分号;

4.1 变量的默认值

不同于Java语言会给变量赋默认值,C语言中的变量默认值是随机的,取决于为变量分配的内存原来存储的数据。

所以,在使用变量前,一定要明确赋值。

int main()
{
    int j;
    // 使用未赋值的变量j,j的值不可预测
    printf("Hello, %d World!\n", j);
    return 0;
}

在这里插入图片描述

4.2 值类型

变量的值应该与类型一致,不应该赋予不是同一个类型的值,比如num的类型是整数,就不应该赋值为小数。虽然 C 语言会自动转换类型,但是应该避免赋值运算符两侧的类型不一致,否则可能产生难以预测的结果。

4.3 赋值表达式的结果

我们知道,表达式是有结果的,赋值表达式也是有计算结果的。所以赋值表达式有两重效果:

  • ①给变量赋值。
  • ②表达式本身也会返回计算结果,结果是变量的值。

如下代码,赋值表达式 j = 10 的计算结果是10,正是因为这个特性,赋值表达式 j = 10 才能作为参数传递给函数。

int main()
{
    int j;
    printf("Hello, %d World!\n", j = 10);
    return 0;
}

在这里插入图片描述

4.4 左右值

C 语言有左值(left value)和右值(right value)的概念。

左值是可以放在赋值运算符左边的值,一般是变量;右值是可以放在赋值运算符右边的值,一般是一个具体的值。

这是为了强调有些值不能放在赋值运算符的左边,比如 x = 1 是合法的表达式,但是 1 = x 就会报错。

5. 变量作用域

作用域决定了变量在程序中的可见性和生命周期。

5.1 代码块

C语言变量作用域和代码块密切相关,代码块是一对大括号{ }包裹的代码集合。

在C语言中,代码块可以分为如下几种。

5.1.1 函数体代码块

函数是C语言中执行特定任务的代码块,每个函数由返回类型、函数名、参数列表和函数体组成。

#include <stdio.h>

// 定义一个函数,用于打印问候语
void greet() {
    printf("Hello, World!\n");
}

int main() {
    greet(); // 调用函数
    return 0;
}

5.1.2 复合语句代码块

复合语句是由大括号包围的一组语句,常用于if语句、循环语句等控制结构中。

int main() {
    int x = 10;
    
    if (x > 5) {
        // 这是一个复合语句代码块
        printf("x is greater than 5.\n");
    }
    
    return 0;
}

5.1.3 循环体代码块

在for、while、do-while循环中,循环体本身就是一个代码块。

int main() {
    for (int i = 0; i < 5; i++) {
        // 循环体代码块
        printf("Iteration: %d\n", i);
    }
    
    return 0;
}

5.1.4 switch-case代码块

switch语句中的每个case部分和可选的default部分也是代码块。

int main() {
    int day = 3;
    
    switch(day) {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n"); // 当day为3时,执行此代码块
            break;
        default:
            printf("Invalid day\n");
    }
    
    return 0;
}

5.1.5 初始化代码块

虽然C语言标准中没有直接支持初始化代码块的概念,但可以在函数开始或复合语句中初始化多个变量。

int main() {
    {
        // 这个代码块用于初始化
        int a = 1;
        int b = 2;
        printf("a: %d, b: %d\n", a, b);
    } // 此处代码块结束,a和b的作用域结束

    return 0;
}

5.1.6 注意事项,

关于代码块,有两个注意事项。

一是C语言的代码块不能独立于函数外单独存在。

#include <stdio.h>

int i;

// 在函数体外单独定义代码块
{
    i = 10;
}

int main() {
    return 0;
}

如上,在函数体外单独定义代码块,编译时报错。

在这里插入图片描述

二是C语言的代码块中可以嵌套代码块。

    {
        // 这个代码块用于初始化
        int a = 1;
        int b = 2;
        
        {
            int a = 1;
            int b = 2;
            printf("第二层嵌套:a: %d, b: %d\n", a, b);
        }
        
        printf("第一层嵌套:a: %d, b: %d\n", a, b);
    } // 此处代码块结束,a和b的作用域结束

    return 0;
}

在这里插入图片描述

5.2 作用域分类

C 语言的变量作用域主要有两种:文件作用域(file scope)和块作用域(block scope)。

5.2.1 快作用域

在函数或代码块内部定义的变量,仅在此范围内可见。

块作用域(block scope)指的是由大括号 {} 组成的代码块,它形成一个单独的作用域。凡是在块作用域里面声明的变量,只在当前代码块有效,代码块外部不可见。

#include <stdio.h>

int i = 10101;

int main() {
    int a = 1;
    int b = 2;
    {
        // 这个代码块用于初始化
        int a = 1;
        int b = 2;
        
        {
         // 内层代码块覆盖外层代码块同名变量
            int a = 1;
            int b = 20;
            int c = 200;
            printf("第二层嵌套:a: %d, b: %d\n", a, b);
        }
        
        printf("第一层嵌套:a: %d, b: %d\n", a, b);
    } // 此处代码块结束,a和b的作用域结束

    return 0;
}

如上,在嵌套的作用域中,有两点需要注意:

  • ①如果内层的变量与外层同名,那么会在当前作用域覆盖外层变量。示例中第二层嵌套中的变量 b 会覆盖外层的变量,其值是 20
    在这里插入图片描述
  • ②外层代码块不能访问内层代码块定义的变量,如下图外层代码块试图使用内层代码块声明的变量 c,编译器会报错。
{
  int a = 0;
  {
     int c = 0;
  }
  printf("c = %d", c);
}

在这里插入图片描述

5.2.2 文件作用域

文件作用域(file scope)指的是,在源码文件顶层声明的变量,从声明的位置到文件结束都有效。

#include <stdio.h>

int i = 10101;

int main() {
    return 0;
}

如上代码中定义的变量 i 的作用域就是文件作用域。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3中使用defineProps、defineEmits和defineExpose

一、defineProps 父组件通过 v-bind 绑定一个数据&#xff0c;然后子组件通过 defineProps 接受传过来的值。 父组件&#xff1a; <template><StudyDefineProps :title"title" /> </template><script setup lang"ts"> import { r…

如何设置EVM/IMA密钥即如何生成签名密钥和证书

为生成和使用签名密钥来配置 IMA&#xff0c;以下是详细步骤&#xff0c;包括如何生成签名密钥和证书。 1. 生成签名密钥和证书 首先&#xff0c;我们需要一个私钥和一个自签名证书。我们将使用 OpenSSL 来生成这些密钥和证书。 生成私钥 openssl genpkey -algorithm RSA -…

k8s之HPA,命名空间资源限制

一、HPA 的相关知识 HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;…

idea ctrl+shift+f 全局搜索失效的解決方法

一定是輸入法的問題&#xff0c;而且是簡繁輸入快捷鍵的問題 你看我按了ctrlshiftf 之后直接打出来繁体字了。微软拼音的解决方法如下&#xff1a; 打开微软拼音输入法设置 关闭它

【稳定检索/投稿优惠】2024年心理健康与社会科学国际会议(MHSS 2024)

2024 International Conference on Mental Health and Social Sciences 2024年心理健康与社会科学国际会议 【会议信息】 会议简称&#xff1a;MHSS 2024截稿时间&#xff1a;点击查看大会地点&#xff1a;中国三亚会议官网&#xff1a;www.icmhss.com会议邮箱&#xff1a;mhs…

刷代码随想录有感(101):动态规划——有障碍的最短路径

题干&#xff1a; 代码&#xff1a; class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();if(obstacleGrid[0][0] 1 || obstacleGrid[m - 1][n - 1] 1)r…

python-docx初探——如何用python新建world—添加段落、标题、表格

python-docx初探&#x1f680; 在项目中需要用到使用代码来编写一些结构化的文档&#xff0c;所以这里就需要涉及到一些需要用代码写world的一些工作&#xff0c;经过简单了解&#xff0c;python操作world最主要使用的就是python-docx文档&#xff0c;所以这次就先学一下这个库…

便民智慧小程序源码系统 同城信息+商家联盟+生活电商 功能强大 带完整的安装代码包以及搭建部署教程

系统概述 便民智慧小程序源码系统是一个高度集成化的本地化服务平台解决方案&#xff0c;它融合了同城信息发布、商家联盟管理和生活电商平台三大核心模块&#xff0c;旨在打造一个全方位、多维度的生活服务生态系统。该系统采用先进的前后端分离架构&#xff0c;支持快速响应…

Cartographer学习笔记

Cartographer 是一个跨多个平台和传感器配置提供 2D 和 3D 实时同步定位和地图绘制 (SLAM) 的系统。 1. 文件关系 2. 代码框架 common: 定义了基本数据结构和一些工具的使用接口。例如&#xff0c;四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等…

变量的基本原理

目录 注意&#xff1a; 程序中 号的使用 数据类型 string类 变量相当于内存中一个数据存储空间的表示&#xff0c;你可以把变量看做是一个房间的门牌号&#xff0c;通过门牌号我们可以找到房 间&#xff0c;而通过变量名可以访问到变量(值)。 int age 30; double score …

iFlyCode:AI智能编程助手引领未来软件开发新趋势

体验地址 在当前软件行业飞速发展的背景下&#xff0c;开发效率和代码质量成为了衡量软件工程师工作效能的两大关键指标。为了应对日益增长的市场需求和紧迫的发布时间&#xff0c;科大讯飞推出了iFlyCode2.0——一款集AI技术于一身的智能编程助手&#xff0c;旨在引领未来软件…

Linux C语言:指针的运算

一、指针的算术运算 1、指针运算 指针运算是以指针所存放的地址作为运算量而进行的指针运算的实质就是地址的计算 2、指针的算数运算 指针加上整数&#xff0c;指针减去整数, 指针递增&#xff0c;指针递减和两个指针相减。 指针加减一个n的运算: px n px - n 移动步长…

Windows远程桌面连接

试验&#xff1a;使用Oracle VM VirtualBox创建虚拟机与物理机进行远程桌面连接实验 1. 准备 使用VirtualBox创建一台win10虚拟机&#xff0c;并与本地物理机相互ping通。&#xff08;注意&#xff1a;如何存在ping不通&#xff0c;可以试一下关闭Windows的防火墙&#xff09;…

【机器学习】机器学习与金融科技在智能投资中的融合应用与性能优化新探索

文章目录 引言机器学习与金融科技的基本概念机器学习概述监督学习无监督学习强化学习 金融科技概述股票预测风险管理资产配置 机器学习与金融科技的融合应用实时市场数据分析数据预处理特征工程 股票预测与优化模型训练模型评估 风险管理与优化深度学习应用 资产配置与优化强化…

突破管理瓶颈:基于前端技术的全面预算编制系统解析

前言 在现代商业环境中&#xff0c;预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而&#xff0c;由于市场的不断变化&#xff0c;准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战&#xff0c;建立一个高效的系统来管理和审查销售数据的重…

从PCB到芯片的电源控制

随着硅技术的进步&#xff0c;ASIC 密度更高&#xff0c;逻辑电压随之降低。较低的电压与较高的电流要求相结合&#xff0c;要求电源具有更严格的容差。从 PCB 到芯片的电源控制是本研究的主题。使用典型旁路值的频率扫描仿真表明&#xff0c;分立封装电容器并不是降低芯片电源…

Java面试八股之子类可以从父类继承哪些内容

Java子类可以从父类继承哪些内容 Java子类可以从父类继承以下内容&#xff1a; 属性&#xff08;Fields/Variables&#xff09;&#xff1a; public&#xff1a;子类可以继承父类所有的public修饰的属性。 protected&#xff1a;子类可以继承父类所有的protected修饰的属性…

Redisson 实现分布式锁

1、相关配置 Component public class RedissonDistributedLock {Autowiredprivate RedissonClient redissonClient;public boolean tryLock(String lockKey, long expireTime, long waitTime) throws InterruptedException {RLock lock redissonClient.getLock(lockKey);retu…

C++ 引用 - 引用的特点|在优化程序上的作用

引用是C 的一个别名机制&#xff0c;所谓别名&#xff0c;就是同一块内存共用多个名字&#xff0c;每个名字都指的是这片空间&#xff0c;通过这些别名都能访问到同样的一块空间。 就像鲁迅和周树人是同一个人。 ——鲁迅 一、引用的基本用法 int a 10; int& ref a; // …

Python实现base64加密/解密

实现原理&#xff1a;导入base64库 一、加密 import base64# 加密 username "admin" base64_username base64.b64encode(username.encode(utf-8)).decode() print(base64_username) password "123" base64_password base64.b64encode(password.encod…