变量

简介: 变量

简介

变量其实只不过是程序可操作的存储区的名称。 C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。


变量的名称可以由字母数字下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C大小写敏感的。


基本变量类型

基础变量类型主要有五种,分别为: charintfloatdoublevoid 。下表是基本变量类型的描述

类型 描述
char 通常是一个 字节八位), 这是一个整数类型
int 整型, 4 个字节,取值范围 [-2147483648, 2147483647]
float 单精度浮点值。单精度是这样的格式, 1符号8指数23小数

float变量存储.png


| | double |双精度浮点值。双精度是 1符号11指数52小数


double变量存储.png

| | void |表示类型的缺失。|


变量定义

变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,语法如下所示:

type variable_list;点击复制复制失败已复制


在这里, type 必须是一个有效的 C 数据类型,可以是 charw_charintfloatdouble 或任何用户自定义的对象, variable_list 可以由一个或多个标识符名称组成,多个标识符之间用 逗号 分隔。下面列出几个有效的声明:

int    i, j, k;
char   c, ch;
float  f, salary;
double d;点击复制复制失败已复制


变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:

type variable_name = value;点击复制复制失败已复制


下面列举几个实例:

extern int d = 3, f = 5;    // d 和 f 的声明与初始化
int d = 3, f = 5;           // 定义并初始化 d 和 f
byte z = 22;                // 定义并初始化 z
char x = 'x';               // 变量 x 的值为 'x'点击复制复制失败已复制


不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL (所有字节的值都是 0 ),其他所有变量的初始值是未定义的。


变量声明

变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。


变量的声明有两种情况:

  • 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
  • 另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。


注意

除非有 extern 关键字,否则都是变量的定义。

extern int i; //声明,不是定义
int i; //声明,也是定义点击复制复制失败已复制


示例

在下面的实例中,变量在头部就已经被声明,但是定义与初始化在主函数内:

#include <stdio.h>
// 函数外定义变量 x 和 y
int x;
int y;
int addtwonum()
{
  // 函数内声明变量 x 和 y 为外部变量
  extern int x;
  extern int y;
  // 给外部变量(全局变量)x 和 y 赋值
  x = 1;
  y = 2;
  return x+y;
}
int main()
{
  int result;
  // 调用函数 addtwonum
  result = addtwonum();
  printf("result 为: %d",result);
  return 0;
}点击复制复制失败已复制


当上面的代码被编译和执行时,它会产生下列结果:

result 为: 3点击复制复制失败已复制


如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。


addtwonum.c 文件内容:

/*外部变量声明*/
extern int x ;
extern int y ;
int addtwonum()
{
  return x+y;
}点击复制复制失败已复制


test.c 文件内容:

#include <stdio.h>
/*定义两个全局变量*/
int x=1;
int y=2;
int addtwonum();
int main(void)
{
  int result;
  result = addtwonum();
  printf("result 为: %d\n",result);
  return 0;
}点击复制复制失败已复制


当上面的代码被编译和执行时,它会产生下列结果:

$ gcc addtwonum.c test.c -o main
$ ./main
result 为: 3点击复制复制失败已复制


左值(Lvalues)和右值(Rvalues)

C 中有两种类型的表达式:

  1. 左值lvalue):指向内存位置的表达式被称为左值lvalue)表达式。左值可以出现在赋值号的左边右边
  2. 右值rvalue):术语右值rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。


变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:

int g = 20;点击复制复制失败已复制


但是下面这个就不是一个有效的语句,会生成编译时错误:

10 = 20;
目录
相关文章
|
Java 数据挖掘 Go
JCR一区7.7分|单细胞联合bulk-seq的线粒体自噬,分析方法都挺好
这篇文章介绍了研究者通过分析单细胞和Bulk RNA测序数据,鉴定出18个与胃癌(GC)进展相关的线粒体自噬相关基因(MRG),并建立了基于这些基因的预后模型。研究发现GABARAPL2和CDC37可能是GC的预后标志物和潜在治疗靶点。此外,分析揭示了细胞间通讯模式和免疫浸润状态,暗示MRG可能影响GC的免疫治疗响应。整体而言,这项工作为GC的诊断和治疗提供了新见解。
366 0
|
存储 算法 Cloud Native
AliExpress智能营销引擎大揭秘-AnalyticDB如何做到快准狠省
AliExpress(简称AE)是从集团内wholesale孵化出来面向全球消费者的B2C电商平台,目前也是全球化电商业务的排头兵。AnalyticDB MySQL作为链路核心,支撑了AE业务的快准狠省的智能营销。在数据时效性、高并发、低延时以及复杂分析等方面提供了强力的保障。
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
607 21
|
12天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
970 110
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。