所以目前作爲該做而存在的循環體是一個塊:
do
{ // begin block
int i = get_data();
// whatever you want to do with i;
} //end block
while (i != 0);
它是如何與一個塊範圍內工作,從部分3.3.3
塊範圍:
A name declared in a block (6.3) is local to that block; it has block scope. Its potential scope begins at its point of declaration (3.3.2) and ends at the end of its block. A variable declared at block scope is a local variable.
所以顯然i
的範圍是塊,所以你需要一個規則,可以在塊範圍時創建某種特殊的操作。這實際上如何工作?這似乎是最簡單等同是將申報吊到新創建的外塊:
{
int i = get_data(); // hoist declaration outside
do
{ // begin block
// whatever you want to do with i;
} //end block
while (i != 0);
}
這有可能,如果所有的申報工作得很好,在身體的開始,但對於這樣一個場景:
int k = 0 ;
do
{
int i = get_data();
k++ ; // side effect before declaration
int j = k ; // j it set to 1
}
while (i != 0);
懸掛後:
int k = 0 ;
{
int i = get_data();
int j = k ; // j is set to 0
do
{
k++ ;
}
while (i != 0);
}
另一種方法是將範圍從DO,同時開始延伸,但會打破各種記錄的受到影響的行爲。這將打破名字隱藏在塊範圍是如何工作的,從部分3.3.10
名稱隱藏:
A name can be hidden by an explicit declaration of that same name in a nested declarative region or derived class (10.2).
和例如從3.3.1
表明這一點:
int j = 24;
int main() {
int i = j, j;
j = 42;
}
在main
的j
隱藏了全球j
但如何將爲我們的特別工作,而範圍?:
int j = 24;
do {
int i = j, j;
j = 42;
} while(j != 0)
將前面的內容擴展到內部j
的範圍,肯定會破壞很多現有代碼,並且看到前面的示例,沒有直觀的方式來提升聲明。
我們最終可以玩這個遊戲,並找到一些可行的東西,但它看起來像很多工作只是很少的收穫,它是完全不直觀的。
你在代碼示例中的含義是什麼意思?*「聲明之前的副作用」*是指什麼? – dyp 2014-12-14 00:46:45
@dyp我加了後應該澄清的例子,如果不讓我知道。 – 2014-12-14 17:46:48