一般来说,对于任何语言,如果您重用变量名,然后您决定将部分代码重构为另一种方法,您最终不得不添加或编辑声明。
int i;
for(i = 0; i < 10; ++i) {
printf("%d\t%d\n", i , i * i);
}
for(i = 0; i < 10; ++i) {
printf("%d\t%d\n", i , i * i * i);
}
假设您采用第二个循环并将其移至一个print_cubes
方法。您将不能只剪切和粘贴 for 循环,因为i
那里没有声明。一个好的 IDE 可能能够插入声明,但它可能会担心i
您键入的代码中的副作用。
通常,编译器可以通过所谓的图形着色算法来合并使用的变量。考虑这个变体:
for(int i = 0; i < 10; ++i) { // BLOCK 1
printf("%d\t%d\n", i , i * i);
} // END BLOCK 1
for(int j = 0; j < 10; ++j) { // BLOCK 2
printf("%d\t%d\n", j , j * j * j);
} // END BLOCK 2
编译器列出了使用的变量:i
, j
. 它列出了正在使用的块:BLOCK 1,BLOCK 2。父函数也是一个块,但仅在 BLOCK 1i
和j
BLOCK 2 中可见。因此,它制作了变量图,并仅在它们存在时才连接它们在同一块中可见。然后,它尝试计算为每个顶点着色所需的最小颜色数,而不给两个相邻顶点相同的颜色,类似于 Haken-Appel 四色定理。这里; 只需要一种颜色。