回答
IIRC這是一個GNU主題的尾巴呼叫。通常情況下,您會將該優化保留給編譯器,但在編寫內核或嵌入式設備驅動程序時可能非常有用。
我不認爲它是關於_tail calls_或_optimizations_的東西,這只是一個GCC擴展更通用的用途。 – 2011-03-16 22:06:37
我認爲尾調用接近唯一*安全*使用該構造是有爭議的。 – geekosaur 2011-03-16 22:14:37
並不意味着這是他們的目的。 – 2011-03-16 23:50:21
這是GCC特有的。它不是標準的C(C89或C99)。 (它有時候會派上用場,但爲了能夠計算gotos。)
這就是所謂的Labels as Values並代表GCC的一個擴展。
舉個例子,我已經應用了擴展給出answer到Printing 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:
}
到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;
}
不幸的是,&&
從來沒有。這不是C.它可能在「GNU C」中,但正如Paul評論的那樣,「FORTRAN最糟糕的功能之一」,「將...移植到C中」,因此應該被認爲是有害的。
其實沒有。即使是C的作者也認識到,在某些情況下,goto可能實際上比C中的其他結構化控制更受歡迎。 當然,繼續和斷開是一個非常長的路, goto'。一般的建議仍然是:謹慎使用'goto'。 – 2017-05-11 00:44:10
@JeffSzuhay:這個答案並不是說goto被認爲是有害的,而是GNU C計算goto是有害的。 – 2017-05-11 12:43:00
- 1. 什麼時候在C#中使用類?
- 2. 什麼時候在C++中使用「declare」?
- 3. intn_t什麼時候使用它,什麼時候不使用
- 4. 什麼時候應該使用async/await,什麼時候不用?
- 5. 什麼時候使用__proto__和什麼時候使用原型
- 6. 什麼時候應該使用AWS,什麼時候不使用
- 7. 什麼時候使用Ruby和什麼時候使用PHP
- 8. 什麼時候使用ByteString,什麼時候不使用?
- 9. 什麼時候使用ANTLR
- 10. 什麼時候和爲什麼我會在C++中使用abs
- 11. 目標C什麼時候使用alloc和什麼時候不到
- 12. 在TypeScript中,什麼時候使用「let」,什麼時候使用「const」?
- 13. 什麼時候使用for-each和什麼時候在xslt中使用apply-templates?
- 14. 什麼時候使用VK_IMAGE_LAYOUT_GENERAL
- 15. 什麼時候使用sIFR?
- 16. 什麼時候使用MessageDigest.reset()
- 17. JOINS什麼時候使用?
- 18. Railties - 什麼時候使用
- 19. 什麼時候使用SpringApplicationBuilder?
- 20. 什麼時候使用GWT,什麼時候不需要
- 21. 什麼時候使用SVDRecommender
- 22. 什麼時候使用StringIO?
- 23. 什麼時候使用Dispose
- 24. 什麼時候使用uncaught_exception?
- 25. 什麼時候使用vtable?
- 26. SQL Server CASE什麼時候不使用CASE什麼時候
- 27. ZF2什麼時候使用getServiceLocator()什麼時候不到
- 28. KineticJS:我什麼時候使用toImage()以及什麼時候使用緩存()
- 29. 什麼時候應該使用sed,什麼時候應該使用awk
- 30. C#多態 - 爲什麼&什麼時候
對我來說看起來不像C。 – bmargulies 2011-03-16 20:17:36
我不知道是誰投票結束這一決定,但這是一個完全合理的問題。 – 2011-03-16 20:23:55
@Tomalak Geret'kal:可能有人認爲,因爲他們不識別語法,所以不能是有效的代碼。 – 2011-03-16 20:30:03