gl5_progのメモ

自分のためのメモとかまとめとか

(ideoneメモ)if文などのスコープについて

http://ideone.com/GJO3u6

#include <stdio.h>
 
int main( void )
{
    if ( int a = 1 )
    {
        /* error
        int a = 2;
        */
        printf( "a = %d\n", a );
    }
    /* error
    printf( "a = %d\n", a );
    */
    
    for ( int i=0; i<1; ++i )
    {
        /* error
        int i = 10;
        */
        printf( "i = %d\n", i );
    }
    /* error
    printf( "i = %d\n", i );
    */
    
    while ( bool b = false )
    {
        /* error
        bool b = true;
        */
        printf( "b = %s\n", b ? "true" : "false" );
    }
    /* error
    printf( "b = %s\n", b ? "true" : "false" );
    */
    
    /* error
    do
    {
        printf( "b = %s\n", b ? "true" : "false" );
    } while ( bool b = false );
    */
    /* error
    do
    {
        bool b = false;
        printf( "b = %s\n", b ? "true" : "false" );
    } while ( b );
    */
    {
        bool b = false;
        do
        {
            bool b = true;
            printf( "b = %s\n", b ? "true" : "false" );
        } while ( b ); // b == false
    }
    {
        switch ( int c = 99 )
        {
            case 99: // fall
            case 0: { printf( "c = %d ; ", c ); int c = 0; printf( "c = %d\n", c ); } // fall
            case 1: { printf( "c = %d ; ", c ); int c = 1; printf( "c = %d\n", c ); } // fall
            case 2: { printf( "c = %d ; ", c ); int c = 2; printf( "c = %d\n", c ); } // fall
        }
        /* error
        printf( "c = %d\n", c );
        */
    }
    {
        switch ( int c = 99 )
        {
            case 99: // fall
            case 0: printf( "c = %d ; ", c ); /*error int c = 0;*/ printf( "c = %d\n", c ); // fall
            case 1: printf( "c = %d ; ", c ); /*error int c = 1;*/ printf( "c = %d\n", c ); // fall
            case 2: printf( "c = %d ; ", c ); /*error int c = 2;*/ printf( "c = %d\n", c ); // fall
        }
    }
    {
        switch ( int c = 99 )
        {
            case 99: // fall
            case 0: { printf( "c = %d ; ", c );         int c = 0;   printf( "c = %d\n", c ); } // fall
            case 1:   printf( "c = %d ; ", c ); /*error int c = 1;*/ printf( "c = %d\n", c );   // fall
            case 2:   printf( "c = %d ; ", c ); /*error int c = 2;*/ printf( "c = %d\n", c );   // fall
        }
    }
    {
        /* error
        int c = 2;
        switch ( c )
        {
            case 1: { int c2 = 77; // fall
            case 2: printf( "c2 = %d ; ", c2 ); }
        }
        */
        int c = 2;
        switch ( c )
        {
            case 1: { // fall
            case 2: printf( "c = %d ; ", c ); }
        }
        switch ( int c = 99 )
        {
            {
                case 1: // fall
                case 2: printf( "c = %d ; ", c );
            }
        }
    }
    return 0;
}

if文条件式とif文ブロック内は別スコープなのかどうか調べたかったので調査。
条件式とブロック内は同一スコープのようだ。
for文、while文も同様。
ただし、do while文の条件式はブロックの1つ外のスコープ。 なので、

    do
    {
        bool b = false;
        printf( "b = %s\n", b ? "true" : "false" );
    } while ( b );

はエラー。あと、do while文は条件式内で変数の宣言ができない。
ついでに、switch文も調査。
switch文の最初の式でも変数の宣言ができるようだ。
また、caseをまたいだ寿命を持つ変数は宣言できないようだ。