为什么C语言(不是C++)中的初始化与赋值是不一样的

lbh2001 2008-07-30 09:05:50
C语言中没有C++中的构造函数,拷贝构造函数,赋值构造函数
从效果上来说
int a = 100;

int a;
a = 100;
是一样的
但为什么C标准上说初始化和赋值是不一样的呢
除了
const int n = 0;
这种形式只能用初始化,不能用赋值
再排除
int a = 100; //---->现在为a分配内存
/////////////
int a;
a = 100; //---->a已在内存中
还有其他原因吗
...全文
592 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lunarfan 2008-07-31
  • 打赏
  • 举报
回复
记得是再哪本书上看过这问题,压根觉得不重要,没记住。
hazuki9902 2008-07-31
  • 打赏
  • 举报
回复
概念上有混淆~

LZ所谓的“初始化”应该叫定义

而通常意义下,“初始化”是指对已经定义的变量做第一次赋值

int a只是定义,告诉编译器,a是个int型的变量,但是此时并没有分配内存

而a = 100已经将变量a代表的地址内容改写,很显然意义不一样

至于int a = 100则是合并处理

“C标准上说初始化和赋值是不一样的”具体出处在哪?所谓的“不一样”有是什么呢?
zenny_chen 2008-07-31
  • 打赏
  • 举报
回复
楼上说明得不错。

其实比较明显的一点是:


void func(int b)
{
int a;

if(b > 0)
{
a = b;
printf("%d\n", a + b);
}
}



void func(int b)
{
int a = b;

if(b > 0)
printf("%d\n", a + b);
}

两者虽然结果完全一样,但是执行行为可能就不一样了(这也取决于编译器的优化)。
一般而言,前者在执行函数时,若参数b不大于0,那么仅仅是将临时变量a压入堆栈,而不会对它赋值;
而后者不管是参数b是否大于0,都会对变量a进行初始化为b的值。
晨星 2008-07-31
  • 打赏
  • 举报
回复
再退一万步。它们至少还有一个明显的区别:
对于局部变量来说,先定义后赋值,在定义跟赋值之间,有一个值不确定的时期,而且说不定它们之间被谁插上一条语句,就搞出bug来。
而定义加初始化的话,那么变量在使用之前,不存在这么一个值不定的时期。
晨星 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yc_8301 的回复:]
顶9,10楼。。
学习了,,但是我个人觉得还是和编译器的优化有关系。。
[/Quote]
这是两个概念,跟编译器一点关系都没有。
既使在特定的情况下,编译器把它们优化成同样的结果,我们也不能因此就说“初始化就是赋值”。
晨星 2008-07-31
  • 打赏
  • 举报
回复
数组和结构体,打错了。
晨星 2008-07-31
  • 打赏
  • 举报
回复
“初始化和赋值不一样”,这里说的主要还是语法上的区别。
这本质上就是两种东西,根本不可以同时讨论,所以说不一样。
最明显的,数据和结构体都可以使用大括号的语法做初始化,但却不可以这样赋值。
yc_8301 2008-07-31
  • 打赏
  • 举报
回复
顶9,10楼。。
学习了,,但是我个人觉得还是和编译器的优化有关系。。
helloahuan 2008-07-31
  • 打赏
  • 举报
回复
汇编里面应该是一样的
antimatterworld 2008-07-31
  • 打赏
  • 举报
回复
C和C++在goto上的使用有不同的注意事项,原因可能和这个有关系。
juvily 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hazuki9902 的回复:]
概念上有混淆~

LZ所谓的“初始化”应该叫定义

而通常意义下,“初始化”是指对已经定义的变量做第一次赋值

int a只是定义,告诉编译器,a是个int型的变量,但是此时并没有分配内存

而a = 100已经将变量a代表的地址内容改写,很显然意义不一样

至于int a = 100则是合并处理

“C标准上说初始化和赋值是不一样的”具体出处在哪?所谓的“不一样”有是什么呢?
[/Quote]
sundq12 2008-07-31
  • 打赏
  • 举报
回复
楼上的说错了吧!
语句:
int a;
此时已经分配内存了吧;即使不初始化也分配内存了。
不然
printf("%d",a);
这个语句怎么会打印出值了呢?
yyyapple 2008-07-30
  • 打赏
  • 举报
回复
没必要区分这么细

汇编角度都一样,

int a;
a= 100;
0041137E mov dword ptr [a],64h

int b = 100;
00411385 mov dword ptr [b],64h

初始化就是定义的时候赋值,生命期开始

赋值是生命期延续
qiqihit 2008-07-30
  • 打赏
  • 举报
回复
编译const时,编译程序把这类变量放入只读区。应该和汇编中德.data区一个概念吧。直接写入最后的运行程序。只随外部事件而改变。
  • 打赏
  • 举报
回复
没必要想那么多吧?????
coverallwangp 2008-07-30
  • 打赏
  • 举报
回复
赋值涉及删除现存对象,如果没有现存对象,赋值操作符中的动作就会有灾难性的效果
对未构造的内存中的对象进行赋值而不是初始化,其行为是未定义的,对许多类来说,这样做引起运行时崩溃。
lbh2001 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qiqihit 的回复:]
可能一个是编译时确定,一个是程序运行时确定
[/Quote]

说起编译时和运行时
C语言的类型限定符const也只是提供信息给编译器,待编译完后,
const修饰的对象在链接时将丢失常量信息,与普通对象毫无差别
不知对否
qiqihit 2008-07-30
  • 打赏
  • 举报
回复
可能一个是编译时确定,一个是程序运行时确定
BluntBlade 2008-07-30
  • 打赏
  • 举报
回复
一、如果加上了各种修饰关键字,比如static,行为可能会不同;
二、初始化与赋值的语意差别较大,比如给一个数组初始化和给一个数组赋值(在C99以前没好的解决办法)是不一样的;
三、初始化是声明+定义,对编译器的行为有影响;赋值是语句,能返回一个明确的值。
antimatterworld 2008-07-30
  • 打赏
  • 举报
回复
以前在C专家编程中看到过这个解释,那时候想买来看看,结果没买,可惜。
加载更多回复(1)

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧