gpt4 book ai didi

c - 术语定义 - C 应用程序中的范围

转载 作者:行者123 更新时间:2023-12-02 08:50:33 24 4
gpt4 key购买 nike

是否有以下类型的 C 代码的特定术语?在我的示例中,我想增加函数中一小段代码的范围深度,而不必使用不必要的 if/else/for 语句,以便我可以多次重新声明同名变量。例如:

void myfunc(void) {
int a = 0, b = 1;
{
int c;
c = 3;
printf("c is: %d", c);
}

a = 2;
{
int c = 5;
printf("c is %d", c);
}

}

用于描述我如何将一些代码包裹在花括号中并增加范围深度以便函数的其余部分看不到“c”int 的术语是什么?

谢谢!

最佳答案

范围定义为对象处于事件状态的区域。 C中有五个作用域,分别如下。

计划范围

这些是最顶层的声明。它们在程序的生命周期内可用。所有的功能都有这个范围。这也称为全局范围。

文件范围

它的作用域可以从该点到文件末尾进行访问。

void dummy(void) { }
// absence of static automatically gives program scope to `dummy()`

static void dummy(void) { }
// static keyword here gives function `dummy()` a file scope

函数范围

只有标签有这个范围。在此范围内,它们一直处于事件状态直到函数结束。

void printFun()
{
print:
printf(“i is less than j”);
}

int main()
{
int i=1,j=2;
if(i < j)
goto print;
}

此代码将被编译器标记为错误,说标签打印未知,因为标签只有函数作用域。如果必须在函数之间无条件跳转,则必须使用 setjmp/longjmp 函数。

block 作用域

一直到 block 末尾都有效的声明(其中 block 定义为 { } 中的语句)。函数内的所有声明都只有 block 作用域。

int fun(int a, int b)
{
int c;
{
int d;
}
// a, b, c, d all have block scope
}

正如我所说,函数范围仅适用于标签。所以不应与 block 作用域混淆。函数参数被视为在 block 的开头与其他变量一起声明(请记住,函数主体也被视为 { } 中的 block )。因此函数参数具有 block 作用域(不是函数作用域)。

局部作用域是指函数作用域或 block 作用域的一般用法。

原型(prototype)范围

它们的作用域仅在原型(prototype)声明内。这个作用域很有意思,因为变量名只在原型(prototype)声明中有效,不与其他变量名冲突。它存在的时间很短,用处也很少,因此不会引起注意。

int add(int a, float b);

这里的变量 ab 被称为具有原型(prototype)作用域。

选择最小范围

当必须解析名称时,会在最小范围内搜索该名称,如果该名称不可用,则会在更高级别的范围内进行搜索。因此,如果必须声明变量,则必须选择尽可能小的范围。如果您可以限制您的范围,那将提高程序的效率、可读性和可维护性。如果您想要一个在 block 外无用的变量,请在 block 内而不是在外部 block 中声明它。同样,如果您想要一个其值只能在函数内访问但必须在函数调用之间保留值的变量,请选择静态变量而不是全局变量。

关于c - 术语定义 - C 应用程序中的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824301/

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