首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

for里头的定义是重复定义还是重复声明

2013-06-25 
for里面的定义是重复定义还是重复声明?#include stdio.hint main(void){int a 3int i 0for(i 0

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


#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次呢? 定义,嵌套 C
[解决办法]
至少现在的C/C++里。if里的a和printf用的a不是一个a。a被定义了一次(编译时)初始化了三次(运行时)。
[解决办法]
必然是3个3.
for(i = 0; i < 3; i++)
    {   
        if(i == 0){ 
            int a=5;
        }   
        printf("%d\n",a);
    }   
这里面a作为一个堆栈变量,每次遇到大括号就会释放。所以对printf来说是看不到a的。
其次,如果去掉大括号,是可以的。因为它和最前面定义的a不在一个作用域内。可能是你编译问题。
建议看看编译器查找变量名的方式。
[解决办法]
该程序存在一个代码块作用域的问题,if(i==0){int a=5;}中定义的a是具有代码块作用域的局部自动变量,即它只在该代码块内可见,一离开该代码块即被释放,所以该程序打印的a值为3,打印3次。而把if后面的{}去掉,在一些老式编译器里确实会出错,建议用其他的编译器。
[解决办法]
引用:
Quote: 引用:

必然是3个3.
for(i = 0; i < 3; i++)
    {   
        if(i == 0){ 
            int a=5;
        }   
        printf("%d\n",a);
    }   
这里面a作为一个堆栈变量,每次遇到大括号就会释放。所以对printf来说是看不到a的。
其次,如果去掉大括号,是可以的。因为它和最前面定义的a不在一个作用域内。可能是你编译问题。
建议看看编译器查找变量名的方式。


我把括号去掉后就编译不了了,用dev-C++编译
 你的编译器可能有些老了,刚才使用gcc编译无误。不是所有的编译器都支持c的所有特性的,何况是旧的编译器。

热点排行