全局变量与局部变量的疑问?

GNNUXXL 2019-01-21 04:27:08



同一个表达式,一个定义成全局变量,一个定义成局部变量,为啥结果不一样呢?
...全文
333 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
耕者走兔 2019-02-02
  • 打赏
  • 举报
回复
这个问题我的确不知道,如果有知道的请讲解讲解,谢谢。

下面的回答是猜的。

在全局变量下,编译器只是简单的对表达式进行静态求值,然后把表达式替换为值。也就是5-6=-1.。

在局部变量下,编译器不能进行静态求值,值是在运行时取得,所以求值结果就是 6-6=0.。
赵4老师 2019-01-30
  • 打赏
  • 举报
回复
晗生缘 2019-01-30
  • 打赏
  • 举报
回复
按照我的理解是:a-=++a,可以分成两 步:1.a=a+1; 2. a=a-a; 如果a为局部变量,那么a=a+1=5+1=6;此时a=6, 那么a=a-a=6-6=0; 如果a为全局变量,那么a=a+1=5+1=6,但此时的a的含义并不等于全局变量a,而是系统中有一个中间变量如t存储了这个值(6),所以当执行a=a-a时,就变成了a=a-t=5-6=-1; 但不同编译器会有不同的结果,你这个应该是在UNIX系统的Shell编译器吧
starytx 2019-01-30
  • 打赏
  • 举报
回复
新手都喜欢玩这个 ++,--,还研究的一本正经
  • 打赏
  • 举报
回复
什么版本gcc?虽然说求值顺序未定义,但是同一个编译器,只是全局变量和局部变量的不同,对同一个表达式就出现不同的求值结果,也是比较奇葩的。就我的测试结果,C++Builder 7.3、VC++ 14.0、intel c++ 15.0、gcc 5.1.0,32位/64位、开/不开优化,输出都是0
景行清欢 2019-01-29
  • 打赏
  • 举报
回复
不同位置作用域不同
棉猴 2019-01-29
  • 打赏
  • 举报
回复
编译器不同,得到的结果就不同
huyi_beyond 2019-01-29
  • 打赏
  • 举报
回复
不要把精力放在这种牛角尖上,写语法清晰的代码。
耕者走兔 2019-01-28
  • 打赏
  • 举报
回复
是啊,为什么同一个编译器编译结果不一致尼
Top_Spirit 2019-01-21
  • 打赏
  • 举报
回复
这种式子不建议用,也不建议去深度研究,根据编译器的不同,给出的结果也是不同的,总之不太建议去用或者写这种式子。
636f6c696e 2019-01-21
  • 打赏
  • 举报
回复
最近这种日经帖特别多,请百度序列点 在一个序列点对同一个变量多次赋值产生的结果是不可预期的。
lin5161678 2019-01-21
  • 打赏
  • 举报
回复
引用 2 楼 qq_34300249 的回复:
定义的地方不一样,。。。。

和定义的地方没关系
a -= ++a这个表达式是未定义行为
结果没意义

如果写的是符合要求的表达式
这段代码 不管是全局变量还是局部变量结果都是一样的
qq_34300249 2019-01-21
  • 打赏
  • 举报
回复
定义的地方不一样,。。。。
自信男孩 2019-01-21
  • 打赏
  • 举报
回复
a -= ++a

这样的表达式不建议写,也不建议深究。因为这样的表达式具有歧义性,不同的编译器可能处理不一样。

69,373

社区成员

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

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