回覆列表
  • 1 # 三袋大菠蘿

    純C函式符號是不帶型別描述的。

    因此,宣告引數與實現引數不一致的時候,只會以長度來計算。

    比如,一個函式宣告有4個引數,都是32位長,其中3個帶符號,有一個不帶符號。而實現都是符號整數,那這個函式執行很可能不會有任何異常。

    純C語言中,主要和引數個數以及引數是否超過暫存器長度來決定本次傳遞個數。

    如果引數長度小於暫存器長度,按暫存器長度傳遞。

    如果引數長度超過暫存器長度,就按暫存器倍數個數傳遞。

  • 2 # TonyDeng

    實參和形參型別不一致,實際上與不同型別之間的賦值處理相同。C中函式的引數,不管你怎麼宣告,其實都是賦值給形參,通常在編譯階段編譯器會做資料型別檢查,不一致是無法透過的(編譯設定所有警告作錯誤處理是最佳實踐),若你所說的情形出現,則一定是在執行時,查錯與你經驗有關,跟那些溢位、越界之同類是常見bug。寫程式的經驗,是在編碼時預見到可能出現的情況,用程式碼預先防範,不要一拋了事——話說現在的程式猿寫程式很喜歡拋錯誤,這不是解決之道。

    返回正題,執行時碰到這種情況,無非是形參預期某塊記憶體的資料型別,實際上不是那麼回事,卻把它當期望的解讀,那麼一定是錯的資料,其情形類似程式碼int x = "abc",即執行時右邊地址記憶體塊的資料被當int解析給變數x。一般這種情形多在與使用者做互動輸入時發生,記住,你永遠想象不到使用者會如何敲鍵盤或按滑鼠,用scanf("%d",&x)接收使用者輸入整數的,會死得很慘。

    題外話:有些時候,程式猿說自己的程式效率高,恐怕是不做錯誤檢查和預防之下的假象,尤其是面向未知裝置的時候。某系統流暢、快速,在我看來很大程度與它的產品線不面向眾多未知配件有關,全是針對性程式碼,好寫又好用。想當年寫dos程式,強制使用者買VGA顯示卡,我的程式好寫,碰上EGA的就費盡唇舌勸換卡,利潤來了。

  • 3 # 此使用者名稱可以用

    大致可以分兩種情況:

    第一種,形參和實參之間可以相互轉換,主要是涉及不同數值型別,如果形參高於(double>float> int>short)實參沒問題,會把實參轉換為形參型別;如果形參低於實參,編譯時有的會出警告,執行時把實參轉為形參型別,當然有降低精度或者因超出形參表示範圍而發生錯誤的風險;

    第二種情況,二者無法轉換,則編譯時提示錯誤。

  • 中秋節和大豐收的關聯?
  • 馬來西亞PT91坦克好用嗎?