簡體   English   中英

為什么 argc 是“int”(而不是“unsigned int”)?

[英]Why is argc an 'int' (rather than an 'unsigned int')?

為什么命令行參數 count 變量(傳統上是argc )是int而不是unsigned int 這有技術原因嗎?

在嘗試消除所有簽名的未簽名比較警告時,我總是忽略它,但從未理解為什么會這樣。

事實上,原始 C 語言在默認情況下任何變量或參數都被定義為 int 類型,這可能是另一個因素。 換句話說,您可以擁有:

  main(argc, char* argv[]);  /* see remark below... */

而不是

int main(int argc, char *argv[]);

編輯:有效地,正如 Aaron 提醒我們的那樣,非常原始的語法應該是這樣的

  main(argc, argv) char **argv {... } 

由於“原型”是后來才推出的。 這大概是在每個人至少記錄了至少 10 個小時以追蹤與類型相關的微妙(而不是那么微妙)的錯誤之后發生的

幾個原因:

  • 因為沒關系
  • 因為 C 最初沒有unsigned關鍵字或無符號整數類型
  • 因為 C 最初沒有檢查參數類型,甚至沒有原型。
    因此,通常的做法是甚至不聲明int類型,因為這是默認值。
  • 因為從某種意義上說,當時int更重要。 一切都是一個整數。 C 部分是從一種甚至沒有類型的語言演變而來的。 每個變量都是一個word ,這就是int最初的用途。

更新: Jason S詢問消息來源。 我認為您可以從dmr 的在線論文中挖掘所有這些(除了“無關緊要”): The Development of the C Language 您可能需要在通常的地方查找較早的語言 BCPL 和 B。

因為 C 很老,而且它從一開始就是這樣設計的。 現在改變它為時已晚。

這是用 dmr 自己的話來說的 C 編程語言的歷史。 它沒有明確說明(至少不是從我給它的快速瀏覽中),但是 C 的最早版本不支持無符號類型。 mjv 關於隱式類型到int的觀點也是相關的。

編輯

貝爾實驗室的鏈接已經中斷了一段時間:是同一篇論文的備用鏈接。

另一個原因可能是無符號類型不方便迭代。 例如,此代碼段向下迭代:

for (size_t i = SIZE - 1; i >= 0; --i)
  ...

事實上,這是一個錯誤。 當 i 在最后一次迭代中達到 0 時,它將直接進入 4294967295(在 32 位機器上)並且循環不會終止。

出於這個原因,我個人認為普通整數更便於迭代。 使用整數時,當您將for循環從向上計數切換到向下計數時,您不必特別小心。

Google C++ Style Guide建議不要使用unsigned int類型,除非您正在使用實際的位模式。 它們的基本原理也適用於 C。 快速總結行:

... C 的類型提升方案導致無符號類型的行為與人們預期的不同。 ... 不要使用無符號類型。

這可能不是 C 的原始創造者的想法,但誰知道呢‽

作為警告問題的解決方案,您可以執行以下操作來抑制警告:

const unsigned int uargc = (unsigned int) argc;

由於 Java 中沒有無符號類型,因此將來可以更輕松地將 C 程序移植到 Java,這是一個有先見之明的設計決策。

main()的聲明是在將無符號類型添加到語言之前定義的 - 請參閱 DMR 上的“原始 C ”頁面。 添加 unsigned 時,更改為時已晚。

我明白這看起來很奇怪: argc不應該是負數! 但是這樣看: intunsigned int涵蓋了您可以接受的值范圍(如果您有 2^31 個命令行參數,則有問題)並且int鍵入更短。

面試難題:如果 C 和unsigned int argc一起使用,輸入unsigned鍵盤會用完多少?

通過將其設置為 int,范圍被限制在 1 和 INT_MAX 之間。 這通常意味着沒有意外的轉換或別名會將其從無意的環繞中移出范圍。 它還允許實現將整個負和 0 范圍用於系統特定場景。

好吧,我剛剛編的。 真正的原因是,這只是一個原始 C 語言開發人員做出的任意決定,直到現在還沒有人真正認真考慮過。 :)

只是一個簡單的問題:您是否期望超過 2 31 個(甚至超過 2 15 個)命令行參數? 我懷疑大多數操作系統能否處理這么多。

我想它被設計為與 C 兼容,在 C 時代,人們並不太關心有符號/無符號的正確性。

暫無
暫無

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

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