假如我在while中进行变量的声明?

gauldoth 2009-08-11 01:01:28
例如
while(1)
{
int i=0;
i++;
}

这样每次都会声明一次并且被初始化一次么?
...全文
273 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
gauldoth 2009-08-12
  • 打赏
  • 举报
回复
谢谢,明白了很多.
块类声明只能在块内使用,只是编译器的限制吧?
「已注销」 2009-08-12
  • 打赏
  • 举报
回复
说那不负责任的话不嫌丢脸,你们老师那样教你了?

24楼的那要看你编译器支持不支持
WDK中根本不允许在函数代码已经开始的地方再声明变量
「已注销」 2009-08-12
  • 打赏
  • 举报
回复
都说的什么啊,看看反汇编代码好不好,我不知道楼上有多少是错的
以函数为基本单位,函数里所有的局部变量全部在函数开始时候ESP+offset分配,哪来的那么多声明
你程序的汇编代码,好好看看,我就纳闷,一些人在哪看的就说出来了
-----------------------------------------------------------------
.text:00401010 main proc near ; CODE XREF: _mainj
.text:00401010
.text:00401010 var_44 = byte ptr -44h
.text:00401010 var_4 = dword ptr -4
.text:00401010
.text:00401010 push ebp
.text:00401011 mov ebp, esp
.text:00401013 sub esp, 44h //这是给你的函数中所有的变量分配空间
.text:00401016 push ebx
.text:00401017 push esi
.text:00401018 push edi
.text:00401019 lea edi, [ebp+var_44]
.text:0040101C mov ecx, 11h
.text:00401021 mov eax, 0CCCCCCCCh //这是Debug版本的反汇编,为了调试进行的初始化
.text:00401026 rep stosd
.text:00401028
.text:00401028 loc_401028: ; CODE XREF: main+31j
.text:00401028 mov eax, 1
.text:0040102D test eax, eax //while(1)
.text:0040102F jz short loc_401043 //看看要不要退出循环
.text:00401031 mov [ebp+var_4], 0 { //ebp上第一个offset就是你的i,在函数开始分配的
.text:00401038 mov ecx, [ebp+var_4] //找找你的所谓的分配在哪的,你给我个编译器看看是不是在里面分配
.text:0040103B add ecx, 1 //i++
.text:0040103E mov [ebp+var_4], ecx
.text:00401041 jmp short loc_401028 //}//while(1)
.text:00401043 ; ---------------------------------------------------------------------------
.text:00401043
.text:00401043 loc_401043: ; CODE XREF: main+1Fj
.text:00401043 xor eax, eax
.text:00401045 pop edi
.text:00401046 pop esi
.text:00401047 pop ebx
.text:00401048 mov esp, ebp
.text:0040104A pop ebp
.text:0040104B retn
.text:0040104B main endp
「已注销」 2009-08-12
  • 打赏
  • 举报
回复
那是语法检查的事,大括号里面声明的变量只能在大括号里面用

for(int i=0;;)这个东西gcc和vc有出入,你试试就知道了

在vc中for(int i=0;;)还是把i当成括号外声明的
gcc中当成括号内声明的

也就是你说的块

seu_05104106 2009-08-11
  • 打赏
  • 举报
回复
看这个贴子《if、while、for头语句定义变量的作用域(VC++)》:
http://hi.baidu.com/05104106/blog/item/df3958cb52d93818bf09e6fe.html

欢迎指正
这不是鸭头 2009-08-11
  • 打赏
  • 举报
回复
答案是肯定的
zngsai 2009-08-11
  • 打赏
  • 举报
回复
三楼说的是对的。
rick_chen 2009-08-11
  • 打赏
  • 举报
回复
C语言手册已经说过了,不要尝试在循环体里面去声明变量。
「已注销」 2009-08-11
  • 打赏
  • 举报
回复
去死!你看看编译后的汇编代码不就知道了,汇编都是在函数开始划出局部变量区域的

这类问题就看编译后的代码
gauldoth 2009-08-11
  • 打赏
  • 举报
回复
假如不是类呢?
比如是一个int x放在while(1)中呢?
因为觉得有时放循环外,隔得太远,找起来不方便,看起代码来也麻烦..
ccpaishi 2009-08-11
  • 打赏
  • 举报
回复
for的int只会调用一次
while会每次都调用
flyoxs 2009-08-11
  • 打赏
  • 举报
回复
四、实现平台:VC2005
flyoxs 2009-08-11
  • 打赏
  • 举报
回复
实验报告:
一、源代码:
#include <stdio.h>

class Counter
{
public:
Counter()
{
s_counter++;
printf(" - New one\r\n");
}
~Counter()
{
s_counter--;
printf(" - Lost one\r\n");
}

static void Print()
{
printf("Now counter is: %d\r\n", s_counter);
}

protected:
static int s_counter;
};
int Counter::s_counter = 0;

int main()
{
int i = 6;
while(i)
{
Counter cnt;
cnt.Print();
i--;
}
}


二、输出:
 - New one
Now counter is: 1
- Lost one
- New one
Now counter is: 1
- Lost one
- New one
Now counter is: 1
- Lost one
- New one
Now counter is: 1
- Lost one
- New one
Now counter is: 1
- Lost one
- New one
Now counter is: 1
- Lost one


三、while循环改为for循环,结果一样
见习学术士 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 saimen 的回复:]
晕 for 语句是专用格式,前面一名是初始化的,仅在进入FOR的时候调用一次

和while是两回事
[/Quote]

这个给出了答案
fly4free 2009-08-11
  • 打赏
  • 举报
回复
不过 我倒是不同意, 声明N次 这种说法,
声明是对编译器说的
构造是运行时概念……

两个不同时段的概念嘛。。。
fly4free 2009-08-11
  • 打赏
  • 举报
回复
我想,对于简单类型,差别不是那么明显。
你可以试试声明类对象,在构造函数里,把类的静态int成员自加一次,循环N次后,看是不是构造N次。。


(当然,我也没试过……)
dengxuxing 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gauldoth 的回复:]
那么,假如是
while(1)
{
    char bufTemp[256];
    _tcscat_s(bufTemp,256,TEXT("abc"));
}
是不是等价于
char bufTemp[256];
while(1)
{   
    _tcscat_s(bufTemp,256,TEXT("abc"));
}
呢?

也就是说变量声明编译后会自动被扔到前面,但是写可以写在循环里面,有时可读性更好?

话说俺也真是懒,貌似可以看反汇编之类的..还是先问问吧,麻烦大家下.


[/Quote]
是不等价的,前者只要出了循环你就不能用bufTemp了,后者明显就还能用,当然后者比较好
gauldoth 2009-08-11
  • 打赏
  • 举报
回复
编译器不会自动把声明扔前面去么?
liuchaotao 2009-08-11
  • 打赏
  • 举报
回复
局部变量只在声明的块内有效.声明在while块内,所以每次都会被注销,然后重新定义并初始化这个变量i
worry_js 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 saimen 的回复:]
晕 for 语句是专用格式,前面一名是初始化的,仅在进入FOR的时候调用一次

和while是两回事
[/Quote] 正解。。
加载更多回复(8)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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