gpt4 book ai didi

c - 循环有自己的堆栈记录吗? (也就是为什么这段代码合法)

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:11 25 4
gpt4 key购买 nike

好的,所以我有一个小问题要问你。

我打算用 C 编写代码,但我想这在大多数语言中都可以正常工作。

那么,为什么这段代码是合法的:

int x = 1;
while(true) {
int x = x + 2;
}

虽然这需要错误:‘x’的重新定义

int x = 1;
int x = 3;

因此,我知道我可以在程序的不同函数中对变量使用相同的名称,因为每个函数调用都有自己的堆栈记录。

但是循环也有自己的堆栈记录吗?在内存级别,代码 #1 不会导致我在同一个堆栈记录 block 中对变量 x 有 N 个不同的关联?

简而言之,为什么我在代码 #2 中重新定义了 x 变量,但在代码 #1 中却没有?

最佳答案

这两个变量在不同的范围内声明。

int x = 1;
while(true) {
int x = x + 2;
}

在内部作用域中声明的变量隐藏在外部作用域中声明的变量。

注意这个声明

int x = x + 2;

具有未定义的行为,因为声明的变量虽然没有被初始化,但它本身被用作初始化器。

例如你可以这样写

int x = 1;

int main( void )
{
int x = 2;

while ( 1 )
{
int x = 3;
/*...*/
}
}

在这个程序中声明并定义了三个不同的对象,名称为x

第一个变量具有文件作用域,而其他两个变量具有 block 作用域。

至于这段代码

int x = 1;
int x = 3;

同一范围内的两个变量定义了相同的名称。

在 C 中(但不是在 C++ 中)你可以写

#include <stdio.h>

int x;
int x = 1;

int main(void)
{
return 0;
}

因为在文件范围内this

int x;

不是变量 x 的定义,而只是它的声明。

你也可以这样写

#include <stdio.h>

int x;
int x = 1;

int main(void)
{
extern int x;

printf( "x = %d\n", x );

return 0;
}

线

    extern int x;

在 main 的 block 范围内引入全局变量 x 的声明。

至于 while 语句 then (The C STandard, 6.8.5 Iteration statements)

5 An iteration statement is a block whose scope is a strict subset of the scope of its enclosing block. The loop body is also a block whose scope is a strict subset of the scope of the iteration statement.

关于c - 循环有自己的堆栈记录吗? (也就是为什么这段代码合法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com