2011-03-16 53 views
5
| GOTO '*' expr ';' 

我從來沒有見過這樣的言論,任何人都可以舉個例子嗎?什麼時候使用goto * expr;在C?

+5

對我來說看起來不像C。 – bmargulies 2011-03-16 20:17:36

+5

我不知道是誰投票結束這一決定,但這是一個完全合理的問題。 – 2011-03-16 20:23:55

+3

@Tomalak Geret'kal:可能有人認爲,因爲他們不識別語法,所以不能是有效的代碼。 – 2011-03-16 20:30:03

回答

3

IIRC這是一個GNU主題的尾巴呼叫。通常情況下,您會將該優化保留給編譯器,但在編寫內核或嵌入式設備驅動程序時可能非常有用。

+0

我不認爲它是關於_tail calls_或_optimizations_的東西,這只是一個GCC擴展更通用的用途。 – 2011-03-16 22:06:37

+0

我認爲尾調用接近唯一*安全*使用該構造是有爭議的。 – geekosaur 2011-03-16 22:14:37

+0

並不意味着這是他們的目的。 – 2011-03-16 23:50:21

2

這是GCC特有的。它不是標準的C(C89或C99)。 (它有時候會派上用場,但爲了能夠計算gotos。)

6

這就是所謂的Labels as Values並代表GCC的一個擴展。


舉個例子,我已經應用了擴展給出answerPrinting 1 to 1000 without loop or conditionals問題:

void printMe() 
{ 
    int i = 1; 
    startPrintMe: 
    printf ("%d\n", i); 
    void *labelPtr = &&startPrintMe + (&&exitPrintMe - &&startPrintMe) * (i++/1000); 
    goto *labelPtr; 
    exitPrintMe: 
} 
1

到PrintMe()已經給類似,這裏是用「跳錶」我的解決辦法解決相同的問題,除了它可以執行一個任意的操作,在這種情況下printf()。請注意,引用的標籤必須位於該函數的本地。

int print_iterate(int count) 
{ 
    int i=0; 

    void * jump_table[2] = { &&start_label , &&stop_label }; 

    start_label: 
    printf(++i); 
    // using integer division: i/count will be 0 until count is reached (then it is 1) 
    goto *jump_table[ i/count ]; 

    stop_label: 
    return 0; 
} 
+0

不幸的是,&&

0

從來沒有。這不是C.它可能在「GNU C」中,但正如Paul評論的那樣,「FORTRAN最糟糕的功能之一」,「將...移植到C中」,因此應該被認爲是有害的。

+0

其實沒有。即使是C的作者也認識到,在某些情況下,goto可能實際上比C中的其他結構化控制更受歡迎。 當然,繼續和斷開是一個非常長的路, goto'。一般的建議仍然是:謹慎使用'goto'。 – 2017-05-11 00:44:10

+0

@JeffSzuhay:這個答案並不是說goto被認爲是有害的,而是GNU C計算goto是有害的。 – 2017-05-11 12:43:00

相關問題