日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

switch 語(yǔ)句內(nèi)部變量的定義問題

 renhl252 2014-09-01

C++ 規(guī)定,對(duì)于 switch 結(jié)構(gòu),只能在它的最后一個(gè) case 標(biāo)號(hào)或 default 標(biāo)號(hào)后面定義變量。

為什么呢?先看看下面的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(int i) {
    switch (i) {
    case 1:
        int x = 1;
        break;
    case 2:
        int y = 2;
        break;
    }
}
int main() {
    f(3);
    return 0;
}

 用 g++ 編譯時(shí)會(huì)出現(xiàn)如下錯(cuò)誤:

1
2
錯(cuò)誤:跳轉(zhuǎn)至 case 標(biāo)號(hào) [-fpermissive]
錯(cuò)誤:跳過了‘int x’的初始化

大家都知道,變量的作用域通常是從定義開始有效,直到塊結(jié)束為止。也就是說,上面代碼中定義的 x 和 y 的作用域從定義開始,直到 switch 塊結(jié)束為止,而不是到每個(gè) case 的 break 為止!

而編譯器編譯時(shí)并不能能確定 switch 語(yǔ)句最終會(huì)跳向哪一個(gè) case ,如果程序運(yùn)行時(shí)跳向了 case 2,那么變量 x 就還沒有定義(但是 x 仍存在于自己的作用域中,可能會(huì)被 case 2 使用)。因此,編譯器為了防止程序運(yùn)行時(shí)跳過變量的定義和初始化,它總會(huì)檢查有沒有將變量的定義放在條件塊中,像上面的代碼就會(huì)給出一個(gè)錯(cuò)誤或警告。

如何防止呢?很簡(jiǎn)單:

1. 盡量不要在 switch 語(yǔ)句中定義變量。

2. 為每個(gè) case 中定義的變量顯式指定作用域。即將上面的代碼改為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void f(int i) {
    switch (i) {
    case 1:
        {
            int x = 1;
            // 使用變量 x
            // ...
        }    // 顯式結(jié)束變量 x 的作用域
        break;
    case 2:
        {
            int y = 2;
            // 使用變量 y
            // ...
        }    // 顯式結(jié)束變量 y 的作用域
        break;
    }
}
int main() {
    f(3);
    return 0;
}

C++ 規(guī)定,對(duì)于 switch 結(jié)構(gòu),只能在它的最后一個(gè) case 標(biāo)號(hào)或 default 標(biāo)號(hào)后面定義變量。

為什么呢?先看看下面的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(int i) {
    switch (i) {
    case 1:
        int x = 1;
        break;
    case 2:
        int y = 2;
        break;
    }
}
int main() {
    f(3);
    return 0;
}

 用 g++ 編譯時(shí)會(huì)出現(xiàn)如下錯(cuò)誤:

1
2
錯(cuò)誤:跳轉(zhuǎn)至 case 標(biāo)號(hào) [-fpermissive]
錯(cuò)誤:跳過了‘int x’的初始化

大家都知道,變量的作用域通常是從定義開始有效,直到塊結(jié)束為止。也就是說,上面代碼中定義的 x 和 y 的作用域從定義開始,直到 switch 塊結(jié)束為止,而不是到每個(gè) case 的 break 為止!

而編譯器編譯時(shí)并不能能確定 switch 語(yǔ)句最終會(huì)跳向哪一個(gè) case ,如果程序運(yùn)行時(shí)跳向了 case 2,那么變量 x 就還沒有定義(但是 x 仍存在于自己的作用域中,可能會(huì)被 case 2 使用)。因此,編譯器為了防止程序運(yùn)行時(shí)跳過變量的定義和初始化,它總會(huì)檢查有沒有將變量的定義放在條件塊中,像上面的代碼就會(huì)給出一個(gè)錯(cuò)誤或警告。

如何防止呢?很簡(jiǎn)單:

1. 盡量不要在 switch 語(yǔ)句中定義變量。

2. 為每個(gè) case 中定義的變量顯式指定作用域。即將上面的代碼改為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void f(int i) {
    switch (i) {
    case 1:
        {
            int x = 1;
            // 使用變量 x
            // ...
        }    // 顯式結(jié)束變量 x 的作用域
        break;
    case 2:
        {
            int y = 2;
            // 使用變量 y
            // ...
        }    // 顯式結(jié)束變量 y 的作用域
        break;
    }
}
int main() {
    f(3);
    return 0;
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多