for里面的定义是重复定义还是重复声明?

bewinged 2013-05-25 11:31:43

#include <stdio.h>
int main(void)
{
int a = 3;
int i = 0;
for(i = 0; i < 3; i++)
{
if(i == 0){
int a=5;
}
printf("%d\n",a);
}
return 0;
}

1 你觉得打印的a是多少呢?
2 为什么我把if(i == 0) {}中的“{}”去掉了就编译通不过?
3 你觉得是for循环中的a是定义1次,声明了3次,还是定义了3次呢?
...全文
304 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluewanderer 2013-05-26
  • 打赏
  • 举报
回复
定义是告诉编译器有这么个东西。初始化本身就是赋值,只不过在定义的同时赋值有一些特殊的语法,所以专门叫成初始化。
zybjtu 2013-05-26
  • 打赏
  • 举报
回复
必然是3个3. for(i = 0; i < 3; i++) { if(i == 0){ int a=5; } printf("%d\n",a); } 这里面a作为一个堆栈变量,每次遇到大括号就会释放。所以对printf来说是看不到a的。 其次,如果去掉大括号,是可以的。因为它和最前面定义的a不在一个作用域内。可能是你编译问题。 建议看看编译器查找变量名的方式。
常如意 2013-05-26
  • 打赏
  • 举报
回复
应该三个都是5吧
zybjtu 2013-05-26
  • 打赏
  • 举报
回复
引用 8 楼 zengzhihao 的回复:
[quote=引用 7 楼 zyaiwx 的回复:] 必然是3个3. for(i = 0; i < 3; i++) { if(i == 0){ int a=5; } printf("%d\n",a); } 这里面a作为一个堆栈变量,每次遇到大括号就会释放。所以对printf来说是看不到a的。 其次,如果去掉大括号,是可以的。因为它和最前面定义的a不在一个作用域内。可能是你编译问题。 建议看看编译器查找变量名的方式。
我把括号去掉后就编译不了了,用dev-C++编译[/quote] 你的编译器可能有些老了,刚才使用gcc编译无误。不是所有的编译器都支持c的所有特性的,何况是旧的编译器。
winassembly 2013-05-26
  • 打赏
  • 举报
回复
for循环中的a只在第一次循环(此时i==0)时被定义,且一离开代码块即被释放,其后,因为i的自增运算,不再符合(i==0)这个条件,所以(int a=5;)这一语句不再被执行,自然for循环中的a只被定义了一次,不存在声明。
winassembly 2013-05-26
  • 打赏
  • 举报
回复
该程序存在一个代码块作用域的问题,if(i==0){int a=5;}中定义的a是具有代码块作用域的局部自动变量,即它只在该代码块内可见,一离开该代码块即被释放,所以该程序打印的a值为3,打印3次。而把if后面的{}去掉,在一些老式编译器里确实会出错,建议用其他的编译器。
bewinged 2013-05-26
  • 打赏
  • 举报
回复
引用 7 楼 zyaiwx 的回复:
必然是3个3. for(i = 0; i < 3; i++) { if(i == 0){ int a=5; } printf("%d\n",a); } 这里面a作为一个堆栈变量,每次遇到大括号就会释放。所以对printf来说是看不到a的。 其次,如果去掉大括号,是可以的。因为它和最前面定义的a不在一个作用域内。可能是你编译问题。 建议看看编译器查找变量名的方式。
我把括号去掉后就编译不了了,用dev-C++编译
bewinged 2013-05-25
  • 打赏
  • 举报
回复
引用 2 楼 bluewanderer 的回复:
至少现在的C/C++里。if里的a和printf用的a不是一个a。a被定义了一次(编译时)初始化了三次(运行时)。
被你这么一说我似乎知道了一些 定义的局部变量的作用域是在代码块内即{}内,没有{}时,找不到,所以会编译通不过。打印时,由于if里面的a的作用域仅限在{}内,所以打印的是外面定义的a。 定义和初始化就不清楚了。
bewinged 2013-05-25
  • 打赏
  • 举报
回复
gcc编译器。ubuntu下的
bluewanderer 2013-05-25
  • 打赏
  • 举报
回复
至少现在的C/C++里。if里的a和printf用的a不是一个a。a被定义了一次(编译时)初始化了三次(运行时)。
turing-complete 2013-05-25
  • 打赏
  • 举报
回复
能先讲一下,您用的是什么编译器吗? 在下,先判断一下您使用的是什么C标准。 如果,您用的是C++语言的话,请另行特别声明。

70,020

社区成员

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

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