如果我將一個名為“a”的變數型別轉換為另一個名為“b”的變數型別,那么“b”現在被“a”解釋為新的變數型別。如果我有一個名為“a”的變數型別,并且我用另一種變數型別列印它,則輸出將“a”解釋為新的變數型別。那么 printf 是否正在制作一個隱藏的鑄造程序來做到這一點?
uj5u.com熱心網友回復:
如果我將一個名為“a”的變數型別轉換為另一個名為“b”的變數型別,那么“b”現在被“a”解釋為新的變數型別。
不,強制轉換將值轉換為另一種型別;它不會重新解釋變數。如果a是int值為 3 的 a,則(float) a是float具有相同值 3 的 a。
如果我有一個名為“a”的變數型別,并且我用另一種變數型別列印它,則輸出將“a”解釋為新的變數型別。那么 printf 是否正在制作一個隱藏的鑄造程序來做到這一點?
首先回答第二個問題,不,printf在這種情況下不進行任何鑄造。關于第一個問題,這是在某些情況下可能出現的輸出。但是行為不是由 C 標準定義的。可能發生的一些事情包括:
- 您傳遞
a一種型別的變數,但告訴printf期望另一種型別。printf從放置 的位元組的位置獲取引數的位元組a,但是,因為它需要不同的型別,所以它將位元組解釋為使用其他型別的規則進行編碼,因此它將位元組重新解釋a為新型別. - 您傳遞
a一種型別的變數,但告訴printf期望另一種型別。但是,傳遞這些型別的規則說要在不同的地方傳遞它們。a可能在通用處理暫存器中傳遞,但其他型別可能在浮點暫存器中傳遞。所以printf從它期望的地方獲取位元組,但 的位元組a不在那里。相反,printf獲取一些碰巧在暫存器中的其他位元組并將它們轉換為列印。 - 引數傳遞以其他方式失敗并破壞您的程式。
- 編譯器在編譯期間捕獲錯誤并根據設定向您發出警告或拒絕編譯您的程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369511.html
標籤:C
上一篇:AF_UNIX套接字路徑中“\0hidden”的目的是什么?
下一篇:為二維陣列釋放連續的記憶體塊
