簡體   English   中英

如何修復“錯誤:控制到達非空函數結束”?

[英]How to fix "error: control reaches end of non-void function"?

int climbStairs(int n ){

    if(n==1){
        return 1;
    }
    if (n>=2){
         return (2+ climbStairs(n-2)+ climbStairs(n-1));
    }
}

在此處輸入圖片說明

如何修復編譯器錯誤?

你的編譯器沒有你那么聰明。 您可能很清楚,函數永遠不會在n小於 1 時被調用,但編譯器不會。 我個人認為對於典型的輸入,它被稱為n0

因此,它認為程序控制可以在沒有顯式返回的情況下到達函數右大括號} ,如果您使用函數返回值,那么在形式上是未定義的行為,重復一遍,我認為您這樣做了。

您收到此警告,編譯器向您發出的警告提升為錯誤,因此編譯停止。

一些修復:

  1. 用更強的if (n <= 1){阻止遞歸。

  2. 使用assert(false)或類似方法在右大括號}之前運行時斷言。

  3. 關閉將該警告提升為錯誤,但仍要處理該警告。


來自@JonathanLeffler 的一些建議

不要關閉 -Werror - 它太有價值了。 處理警告。 斷言(n >= 0); 在頂部; 如果 (n <= 1) { 返回 1; 以及。 斷言在調試版本中觸發; 即使沒有啟用斷言,錯誤的參數值也可以合理安全和理智地處理。

除了這里的其他答案之外,還有一個很好的技巧。

如果你絕對確定你知道的比編譯器多,而且沒有什么可返回的,那么放一個abort(); 作為函數的最后一行。 編譯器足夠聰明,知道abort()永遠不會返回,因為它會導致程序崩潰。 這將使警告靜音。

請注意,程序崩潰是一件好事。 因為在這種情況下,當“不可能的事情”確實發生時,您會崩潰,並且如果您正在使用調試器,它將在您的調試器中彈出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM