The for statement
for ( for-init-statement conditionopt ; expressionopt ) statement
is equivalent to
{
for-init-statement
while ( condition ) {
statement
expression ;
}
}
except that names declared in the for-init-statement are in the same declarative-region as those declared in
the condition, and except that a continue in statement (not enclosed in another iteration statement) will
execute expression before re-evaluating condition.
int main()
{
int const N = 5;
int x[N];
for(int n = N; n--; *p = n) int* p = x + n;
}
?
Здравствуйте, Roman Odaisky, Вы писали:
6.5/2 The substatement in an iteration-statement implicitly defines a local scope (3.3) which is entered and exited each time through the loop.
Your Comeau C/C++ test results are as follows:
Comeau C/C++ 4.3.8 (Aug 19 2006 13:36:48) for ONLINE_EVALUATION_Alpha1
Copyright 1988-2006 Comeau Computing. All rights reserved.
MODE:strict errors C++
"ComeauTest.c", line 6: error: identifier "p" is undefined
for(int n = N; n--; *p = n) int* p = x + n;
^
"ComeauTest.c", line 6: error: "p", declared in for-loop initialization, may not be
redeclared in this scope
for(int n = N; n--; *p = n) int* p = x + n;
^
"ComeauTest.c", line 6: warning: variable "p" was declared but never referenced
for(int n = N; n--; *p = n) int* p = x + n;
^
2 errors detected in the compilation of "ComeauTest.c".
Здравствуйте, elcste, Вы писали:
E>6.5/2 The substatement in an iteration-statement implicitly defines a local scope (3.3) which is entered and exited each time through the loop.
Сказано equivalent — значит, equivalent! А что такое substatement, можно только догадываться
Здравствуйте, Roman Odaisky, Вы писали:
RO>The for statement
...
RO>is equivalent to
...
Значит, не до конца эквивалентно. С т.з. control flow — да. А с вопросов видимости — нет.
RO>int main()
RO>{
RO> int const N = 5;
RO> int x[N];
RO> for(int n = N; n--; *p = n) int* p = x + n;
RO>}
?
Да, вопрос забавный.
Comeau 4.3.8:
//"ComeauTest.c", line 6: error: identifier "p" is undefined
for(int n = N; n--; *p = n) int* p = x + n;
// ^
//"ComeauTest.c", line 6: error: "p", declared in for-loop initialization, may not be
// redeclared in this scope
for(int n = N; n--; *p = n) int* p = x + n;
// ^
По всей видимости, comeau, натолкнувшись на необъявленную переменную, выругался и по умолчанию объявил её как int (типичная практика компиляторов). После чего обнаружил объявление в том же блоке.
VC2005
Test.cpp(6) : error C2065: 'p' : undeclared identifier
А вот VC поместил тело цикла в отдельный блок, поэтому конфликта не произошло.
Кстати, прикольно наблюдать, как меняется реакция компилятора (comeau) в зависимости от того, стейтмент или выражение инициализации
int n;
for( n=0; p; ) int p=0;
// ^- необъявленная переменная
for(int n=0; p; ) int p=0;
// ^--"-- ^- повторное объявление
for(int n=0; p; ) { int p=0; }
// ^--"-- ^- одни скобки не спасли
for(int n=0; p; ) {{ int p=0; }}
// ^--"-- двойная защита :) - блок поставлен
... << RSDN@Home 1.2.0 alpha rev. 655>>
Здравствуйте, Roman Odaisky, Вы писали:
RO>Сказано equivalent — значит, equivalent! А что такое substatement, можно только догадываться
Так уже следующий за процитированным Вами параграф показывает цену этого equivalent.
RO>А что такое substatement, можно только догадываться
In clause 6, the term substatement refers to the contained statement or statements that appear in the syntax
notation.