我以前玩C++,并在想,如果在某些情况下,因为我的C编译器拒绝让我编写代码,例如:

for (int i = 0; i < 30; ++i)
{
   ...
}

我试着写一些东西,比如:
#include <stdio.h>

int main(int argc, char **argv)
{
    {
        int i;
        for (i = 0; i < 30; ++i) {
            printf("%d.\n", i);
        }
    }

    return 0;
}

结果是,我的作用域中没有这个i变量,它的作用超过了我所需要的,并且释放了i,以便在主作用域中用于其他目的(我不会这样做,因为它是按约定的迭代器)。所以我可以写一些愚蠢的代码,比如:
#include <stdio.h>

int main(int argc, char **argv)
{
    int i = 3;

    /* my loop scope. */
    {
        int i;
        for (i = 0; i < 30; ++i) {
            printf("%d.\n", i);
        }
    }
    printf("i remains intact! %d.\n", i);

    return 0;
}

同样,我不会故意让真正的代码被滥用,但在很多情况下,特别是处理libc函数调用中所必需的临时变量,比如sem_getvalue或windows apiFormatMessage,在这里,很容易用许多临时变量扰乱作用域,并混淆正在发生的事情。通过使用未命名的作用域,理论上,我可以通过将这些临时变量隔离到未命名的范围来减少代码的复杂性。
这个想法看起来很傻,但很有说服力,我很好奇用这种方式编写代码是否有任何成本/缺点。用这种方式编写代码是否存在固有的问题,或者这是一种体面的做法?

最佳答案

{
  int x = 3;
  {
     int y = 4;
     int sum = x+y;
  }
}

成本不超过:
{
  int x = 3;
  int y = 4;
  int sum = x+y;
}

因为大括号本身不会转换成任何机器代码,所以它们只是用来告诉编译器有关作用域的信息。
您的变量具有相同名称的事实也没有影响,因为变量名称也仅用于编译器,并且不会更改机器代码。

07-24 14:24