声明变量&定义变量

        从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。这对于以关键字extern进行声明是一定成立的,而对声明格式“int a;”来说,则需要取决于编译器的具体取舍。

对于下面的两句代码:

void func()
{
    int a;           // 《C++ Prime》认为此是定义变量,然而我们此处认为这是声明
    int b=1;        // 定义整型变量b
    a=0;
}

对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到第三句,a=0;时,编译器才会将其压入栈中。而对于int b=0;这一句,编译器就会生成一条指令,为它赋值。如果反汇编,看到的代码可能是这样的:

push 1;
push 0;

当然,并不一定编译器就会样做,也有可能在声明int a时,编译器就会把一个废值入栈,到第三条再为其赋值,这要看编译器的具体取舍,所以,声明不一定不是定义,而定义一定是定义。

但是,下面的声明,一定仅仅是声明:

extern int a;

这表时,有一个int变量a,它一定是在另外其他地方定义的,所以编译器此时一定不会做什么分配内存的事,因为它就是声明,仅仅表明下面的代码引用了一个符号,而这个符号是int类型的a而已。

【举例分析】

#include <iostream>
#include <cstdio> 

using namespace std;

void testVarible()
{
	int a = 10;
	int *pa = &a;
	int b;        // 《C++ prime》中认为此是定义变量
	int c = 10;
	int *pc = &c;
	int d = 10;      // 定义变量并初始化
	int *pd = &d;
	int e = 10;
	printf("a address: %#x\n", &a);
	printf("c address: %#x\n", &c);
	printf("e address: %#x\n", &e);
}

int main()
{
	testVarible();
	return 0;
}

输出结果:

结论:由图可知,在我的编译器中,变量b并未分配栈地址,而d却有分配。

传送门:《C++ Prime》中对于变量声明和变量定义的理解

原文地址:https://www.cnblogs.com/xzxl/p/8622845.html

时间: 2024-11-08 20:47:43

声明变量&定义变量的相关文章

毁三观的变量定义

变量定义变量定义告诉解释器为变量创建存储的位置和数量. 变量定义具有可选类型,并包含该类型的一个或多个变量的列表,如下所示 - type variable_list; 这里,type是可选的本地或全局类型,而variable_list可以包含一个或多个由逗号分隔的标识符名称. 这里显示了一些有效的声明 - local i, jlocal ilocal a,c 行local i,j都声明并定义变量i和j; 它指示解释器创建名为i,j的变量,并将范围限制为局部.变量可以在声明中初始化(分配初始值).

[C++基本语法:从菜鸟变成大佬系列](三):C++的定义变量

变量定义类型 类型 含义 bool 存储值为true或false char 通常为单个八位字节(一个字节).这是一个整数类型 int 机器最自然的整数大小 float 单精度浮点值 double 双精度浮点值 void 表示类型缺失 wchar_t 广泛的字符类型. C++中的变量定义变量定义告诉编译器为变量创建的存储位置和容量.变量定义指定数据类型,并包含该类型的一个或多个变量的列表,如下所示 1 type variable_list; 此处,类型必须是有效的 C++ 数据类型,包括字符.w_

【转】shell 教程——06 Shell变量:Shell变量的定义、删除变量、只读变量、变量类型

Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名的命名须遵循如下规则: 首个字符必须为字母(a-z,A-Z). 中间不能有空格,可以使用下划线(_). 不能使用标点符号. 不能使用bash里的关键字(可用help命令查看保留关键字). 变量定义举例: myUrl="http://see.xidian.edu.cn/cp

Shell脚本变量定义

http://blog.csdn.net/qyf_5445/article/details/8886071 自定义变量bash中变量无类型区分aa=abc123    定义变量并赋值abc123aa=          定义空变量或者清空变量aa,但变量还存在export test="hello world"  设定环境变量testexport或者export -p        显示所有环境变量declare / typeset 选项 变量名declare 或 typeset 有同样

Shell脚本定义变量和环境变量的引用

一.定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名的命名须遵循如下规则: ?首个字符必须为字母(a-z,A-Z). ?中间不能有空格,可以使用下划线(_). ?不能使用标点符号. ?不能使用bash里的关键字(可用help命令查看保留关键字). 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况: for s

(转载)你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义

你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义 第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量对其进行运算:用程序流程控制结构来控制对这些数据的复杂处理过程,最终实现对数据进行处理得到结果,而这就是程序了.但是,随着要处理的问题越来越复杂,程序的代码自然也就会越来越复杂.如果把所有程序代码都放到main()主函数中,主函数也会越

你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义

第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量对其进行运算:用程序流程控制结构来控制对这些数据的复杂处理过程,最终实现对数据进行处理得到结果,而这就是程序了.但是,随着要处理的问题越来越复杂,程序的代码自然也就会越来越复杂.如果把所有程序代码都放到main()主函数中,主函数也会越来越复杂.这就像将所有东西都堆放到一个仓库中,随着东西越堆越多,

变量定义与变量声明

1.看例子如下: int tern=1: main() { extern int tern; ...... 这里tern 声明了两次,第一次声明为变量留出了存储空间.它构成了变量的定义.第二次声明只是告诉编译器使用先前定义的变量tern,因此不是一个定义.第一次声明称为定义声明,第二次声明称为引用声明,关键字extern表明该声明不是一个定义,因此它指示编译器参考其他地方.而且extern是一个引用声明,绝不是定义声明,所以不可用它进行定义操作.木有这种的操作的哦. 2.具有内部链接的静态变量

C++ 变量的声明与定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义