不應該返回類型size_t
而不是?因爲C中的對象的大小是這種類型的,包括傳遞給printf
的字符串。爲什麼printf在C中返回int而不是size_t
回答
爲什麼printf在C中返回int?
不應該是size_t
而是?
它本來可以這樣做,但早期的設計決定是容納負的EOF
的返回值來指示錯誤。
size_t
在早期設計選擇中是事後纔想到的。許多功能使用int
其中size_t
現在用於那些預標準天。
fprintf()
具有環境限制「可以由任何單一的轉換來產生應至少爲4095的字符數」,以便嘗試長輸出可運行成限制任何打印之前INT_MAX/SIZE_MAX
的關注。
非常好的答案,如果你問我 –
@ Jean-FrançoisFabre補充說明:在1970年,RAM的價格大約是[0.70美元,大約每字節1/2工時](http://www.statisticbrain.com/average-歷史價格-的-RAM /)。早期的設計選擇需要考慮用於減少代碼/內存空間的計算機和策略的非常昂貴的成本。 'int'很簡單。 – chux
因此''printf',出於某種原因,或者不符合標準? 因爲它使用'int'來保存字符數。 –
當時編譯器不需要函數聲明來調用函數。沒有聲明或未指定返回類型的函數的返回類型爲int
- 隱式int規則。一些代碼被稱爲printf
,而沒有討厭討厭#include <stdio.h>
。
你基本上是對的 - 實際上printf
應該返回一個更大的類型,因爲從理論上講,輸出比可以放入內存的最大對象的大小更多的字節是可能的。 printf("%s%s", largest_string, largest_string)
或甚至更多使用字段寬度/精度的簡單示例。
原因只是我們堅持的一個歷史性錯誤。這對snprintf
尤其不利,它被人爲地限制爲INT_MAX
,並且如果嘗試使用它創建更長的字符串,則會被迫返回錯誤。
仍然存在返回負數的問題。指示錯誤。 如果現在要重新設計它,你會怎麼做? –
@BiteBytes:要麼使用一個足夠大的類型來使用類型的符號形式,要麼使用'(T)-1',其中'T'是一個無符號類型作爲錯誤指示。請注意,這適用於'snprintf',其中'retval> = n'是您無論如何需要檢查的錯誤條件(導致負回報的截斷或錯誤)。 –
@R ..使用'(T)-1'是個好主意。 'int retval = snprintf(... size_t n,...'和'retval> = n'除了幻想平臺外很好,其中'retval> = n'的INT_MAX> SIZE_MAX是一個帶符號的比較。 – chux
- 1. 爲什麼std :: count(_if)返回iterator :: difference_type而不是size_t?
- 2. 爲什麼fgets接受int而不是size_t?
- 3. Eigen :: Matrix |爲什麼特徵需要int而不是size_t?
- 4. C++ printf字段寬度說明符'。*'預計int不是size_t
- 5. C:投INT爲size_t
- 6. C++:爲什麼我的平均值返回爲int而不是double?
- 7. 爲什麼HttpException.GetHttpCode()返回一個int而不是System.Net.HttpStatusCode?
- 8. 爲什麼python statistics.mean()返回一個int類型,而不是float
- 9. 爲什麼CountDownLatch.getCount()返回一個long而不是int?
- 10. 爲什麼我的函數返回一個Unit而不是Int?
- 11. 爲什麼Random.Next()返回int而不是uint?
- 12. 爲什麼math.Pow10(e int)返回float64而不是int64?
- 13. 爲什麼PHP返回的字符串,而不是INT
- 14. 爲什麼getActualTypeArguments返回Object而不是Integer for Option [Int]?
- 15. 爲什麼InputStream read()返回一個int而不是一個short?
- 16. Intel SSE:爲什麼`_mm_extract_ps`返回'int`而不是`float`?
- 17. 爲什麼INT返回0 - C++
- 18. 爲什麼返回-1而不是0?
- 19. 爲什麼String.Format(「%1s」,「」)不返回「」而是「」?
- 20. 爲什麼user.home返回「\」而不是「/」?
- 21. 爲什麼C#Math.Floor()返回的雙重不是int
- 22. 爲什麼func1的返回類型是Unit,而func2是Int?
- 23. 爲什麼要返回任務<int>而不是int? (異步&等待)
- 24. 爲什麼人們在C++中使用`main()`而不是`int main()`?
- 25. 爲什麼不在C++中使用printf()
- 26. 在Julia中,爲什麼@printf是宏而不是函數?
- 27. C - 爲什麼printf不只是打印?
- 28. Ç爲size_t在printf的
- 29. 爲什麼DateTime.Now.Year是int而不是ushort
- 30. 什麼是printf的返回類型
這只是歷史 - 在事實發生後你不能輕易改變這些東西,而不會破壞現有的代碼,並且當單個'printf'的輸出不可能超過32k時,沒有真正的動機,更不用說2G了。 –
@PaulR是否意味着它應該是'size_t'類型? –
請記住,['printf'返回值](http://en.cppreference.com/w/c/io/fprintf#Return_value)可以是* negative *。 ['size_t'類型](http://en.cppreference.com/w/c/types/size_t)是未簽名的。 –