The `for' statement
От: Roman Odaisky Украина  
Дата: 11.09.06 08:07
Оценка: 31 (2) :)

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;
}
?
До последнего не верил в пирамиду Лебедева.
Re: The `for' statement
От: elcste  
Дата: 11.09.06 09:32
Оценка:
Здравствуйте, 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.

Re: The `for' statement
От: Lorenzo_LAMAS  
Дата: 11.09.06 09:40
Оценка:

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".

Of course, the code must be complete enough to compile and link.
Re[2]: The `for' statement
От: Roman Odaisky Украина  
Дата: 11.09.06 09:53
Оценка:
Здравствуйте, 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, можно только догадываться
До последнего не верил в пирамиду Лебедева.
Re: The `for' statement
От: Кодт Россия  
Дата: 11.09.06 10:26
Оценка:
Здравствуйте, 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>>
Перекуём баги на фичи!
Re[3]: The `for' statement
От: elcste  
Дата: 11.09.06 10:27
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Сказано equivalent — значит, equivalent! А что такое substatement, можно только догадываться


Так уже следующий за процитированным Вами параграф показывает цену этого equivalent.
Re[3]: The `for' statement
От: Lorenzo_LAMAS  
Дата: 11.09.06 11:28
Оценка: 6 (1)
RO>А что такое substatement, можно только догадываться

In clause 6, the term substatement refers to the contained statement or statements that appear in the syntax
notation.

Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.