当前位置: 首页 > 知识库问答 >
问题:

循环变量定义是否允许重叠C?[重复]

阚乐湛
2023-03-14

最近,我无意中编写了如下C代码:

for (size_t i = 0; i < SOME_VALUE; ++i)
{
    for (size_t i = 0; i < ANOTHER_VALUE; ++i)
    {
        // do work with 'i' from inner loop *WITHOUT* any disruption to 'i' from outer loop
    }
}

仔细阅读代码,我发现了这个“错误”。然而,在运行时,它没有引起任何问题。明确地说,我的代码是用相对较新版本的MinGW-w64编译的,以创建本机Win32二进制文件。

当然,代码可以工作,但我很惊讶这是允许的,更奇怪的是,我的GCC-ish编译器没有抱怨它!(这个错误有GCC警告选项吗?)

有人能解释为什么这是允许的,以及为什么内部和外部i变量不冲突/中断吗?理想情况下,有人可以告诉我允许(并支持)这种行为的官方ISO ish C语言定义!

灵感来源:什么版本的C允许你在for循环中声明变量?

共有1个答案

齐承运
2023-03-14

这是允许的,通常被称为阴影,最内层范围的变量在外层范围内阴影任何同名变量

根据C标准关于标识符范围的第6.2.1p4节的规定,这是明确允许的:

...如果标识符在同一名称空间中指定两个不同的实体,则范围可能会重叠。如果是这样,一个实体(内部范围)的范围将严格在另一个实体(外部范围)的范围之前结束。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内隐藏(并且不可见)。

 类似资料:
  • 我一直在检查重叠时间。我的日历实现允许循环或环绕时间(因此在结束时间之后有开始时间是可能的) 例如:,, 我在网上找到的一些答案,当结束时间严格地晚于开始时间时起作用。我该怎么解决这个?我正在使用这个StackOverflow解决方案,但它不能完全工作:确定两个日期范围是否重叠 在这张图片中,两个时间范围重叠,但我的植入没有正确地识别它:重叠的时间 这里是调试输出,它应该返回True,但不是:de

  • 我在StackOverflow上来回寻找这个特定的答案,但是我找不到任何有效的方法。“测试”应该在循环内部执行异步函数后定义。如果我尝试控制台日志"测试"它返回未定义。如何等待循环执行在堆栈中继续? 我还尝试定义一个带有循环的异步函数,然后调用IIFE,等待函数和控制台记录变量。它返回相同的未定义。

  • 问题内容: 这是模块的模块声明: 因此,和之间存在循环依赖关系,对吗?平台模块之间是否允许循环? 问题答案: 模块系统禁止使用子句静态声明循环。对于平台和应用程序模块,这是正确的,并且您给出的示例不违反该规则。 不过,Requires子句只是模块图中可读性优势的一种来源。其他是命令行标志,反射,,我敢肯定还有更多。添加所有这些可能会导致模块图中的循环,并且这是不被禁止的。 在您的具体示例中,仅当

  • 我有这行代码在PHP中读取一个文件的CSV格式与MySQL数据库的结构,并显示创建它所需的SQL代码。我在这里遇到的唯一问题是,我不能打印出主键变量,因为它说它没有定义,即使我之前定义了它。有人能帮我解释一下为什么会出现这个错误吗?这是我的代码:

  • 我想为数组中的每个项目运行一个函数。数组每次都不同,但为此我将只使用一个示例数组。它一直在说未定义的不是一个函数,我假设未定义的是未来的函数。解决这个问题的办法是什么?

  • 我知道如何检查给定的树是否是二叉树。但问题是,如果树包含重复的值,该怎么办。 如何检查可能包含重复值的树是否是二叉查找树重复值必须位于树/子树的右侧。