日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于你可能不知道的printf

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-05 12:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

printf可能是我們在學習C語言的過程中最早接觸的庫函數(shù)了。其基本使用想必我們都已經(jīng)非常清楚了。但是下面的這些情況你是否已經(jīng)清楚地知道了呢?

示例程序

我們來看一個示例程序,看看你能否對下面的結(jié)果輸出有非常清晰的認識。

#include intmain(void) { inta=4; intb=3; intc=a/b; floatd=*(float*)(&c); longlonge=0xffffffffffffffff; printf("a/b:%f,a:%d\n",a/b,a,b);//打印0 printf("(float)a/b:%f\n",((float)a)/b);//打印1 printf("(double)a/b:%lf\n",((double)a)/b);//打印2 printf("d:%f\n",d);//打印3 printf("%.*f\n",20,(double)a/b);//打印4 printf("e:%d,a:%d\n",e,a);//打印5 printf("a:%d,++a:%d,a++:%d\n",a,++a,a++);//打印6 return0; }

編譯為32位程序:

gcc-m32-otesttest.c

在運行之前,你可以自己先猜想一下打印結(jié)果會是什么。實際運行結(jié)果:

a/b:0.000000,a:3//打印0的結(jié)果 (float)a/b:1.333333//打印1的結(jié)果 (double)a/b:1.333333//打印2的結(jié)果 d:0.000000//打印3的結(jié)果 1.33333333333333325932//打印4的結(jié)果 e:-1,a:-1//打印5的結(jié)果 a:6,++a:6,a++:4//打印6的結(jié)果

你的猜想是否都正確呢?如果猜想錯誤,那么接下來的內(nèi)容你就不應該錯過了。

你是否會有以下疑問:

0.打印0的a/b為什么不是1,a為什么不是4?

1.打印1和打印2有什么區(qū)別呢?

2.打印3為什么結(jié)果會是0.000000?

3.打印4的結(jié)果為什么最后的小數(shù)位不對?其中的*是什么意思?

4.打印5中,為什么a的值是-1而不是4?

5.打印6中,結(jié)果為什么分別是6,6,4?

在解答這些問題之前,我們需要先了解一些基本內(nèi)容。

可變參數(shù)中的類型提升

printf是接受變長參數(shù)的函數(shù),傳入printf中的參數(shù)個數(shù)可以不定。而我們在變長參數(shù)探究中說到:
調(diào)用者會對每個參數(shù)執(zhí)行“默認實際參數(shù)提升",提升規(guī)則如下:
——float將提升到double
——char、short和相應的signed、unsigned類型將提升到int

也就是說printf實際上只會接受到double,int,long int等類型的參數(shù)。而從來不會實際接受到float,char,short等類型參數(shù)。
我們可以通過一個示例程序來檢驗:

//badcode #include intmain(void) { char*p=NULL; printf("%d,%f,%c\n",p,p,p); return0; }

編譯報錯如下:

printf.c:Infunction‘main’: printf.c:5:12:warning:format‘%d’expectsargumentoftype‘int’,butargument2hastype‘char*’[-Wformat=] printf("%d,%f,%c\n",p,p,p); ^ printf.c:5:12:warning:format‘%f’expectsargumentoftype‘double’,butargument3hastype‘char*’[-Wformat=] printf.c:5:12:warning:format‘%c’expectsargumentoftype‘int’,butargument4hastype‘char*’[-Wformat=]

我們可以從報錯信息中看到:

%d 期望的是 int 類型參數(shù)

%f 期望的是 double 類型參數(shù)

%c 期望的也是 int 類型參數(shù)

而編譯之所以有警告是因為,char *類型無法通過默認實際參數(shù)提升,將其提升為int或double。

參數(shù)入棧順序以及計算順序

在C語言中,參數(shù)入棧順序是確定的,從右往左。而參數(shù)的計算順序卻是沒有規(guī)定的。也就是說,編譯器可以實現(xiàn)從右往左計算,也可以實現(xiàn)從左往右計算。

浮點數(shù)的有效位

對于double類型,其有效位為15~~16位(參考:對浮點數(shù)的一些理解)。

可變域?qū)捄途?/p>

printf中,*的使用可實現(xiàn)可變域?qū)捄途?,使用時只需要用*替換域?qū)捫揎椃途刃揎椃纯伞T谶@樣的情況下,printf會從參數(shù)列表中取用實際值作為域?qū)捇蛘呔?。示例程序如下?/p>

#include intmain(void) { floata=1.33333333; char*p="hello"; printf("%.*f\n",6,a); printf("%*s\n",8,p); return0; }

運行結(jié)果:

1.333333 hello

而這里的6或者8完全可以是一個宏定義或者變量,從而做到了動態(tài)地格式控制。

格式控制符是如何處理參數(shù)的

printf有很多格式控制符,例如%d,它在處理輸入時,會從堆棧中取其對應大小,即4個字節(jié)作為對應的參數(shù)值。也就是說,當你傳入?yún)?shù)和格式控制符匹配或者在經(jīng)過類型提升后和格式控制符匹配的時候,參數(shù)處理是沒有任何問題的。但是不匹配時,可能會出現(xiàn)未定義行為(有兩種情況例外,我們后面再說)。例如,%f期望一個double(8字節(jié))類型,但是傳入的參數(shù)是int(4字節(jié)),那么在處理這個int參數(shù)值,可能會多處理4個字節(jié),并且也會造成處理數(shù)據(jù)錯誤。

真相大白

有了前面這些內(nèi)容的鋪墊,我們再來解答開始的疑問:

對于問題0,a/b的結(jié)果顯然為4字節(jié)的int類型1,而%f期望的是8字節(jié)的double,而計算結(jié)果只有4個字節(jié),因此會繼續(xù)格式化后面4個字節(jié)的a,而整型1和后面a組合成的8字節(jié)數(shù)據(jù),按照浮點數(shù)的方式解釋時,它的值就是0.000000了。由于前面已經(jīng)讀取解釋了a的內(nèi)容,因此第二個%d只能繼續(xù)讀取4個字節(jié),也就是b的值3,最終就會出現(xiàn)打印a的值是3,而不是4。

對于問題1,實際上在printf中,是不需要%lf的,%f期望的就是double類型,在編譯最開始的示例程序其實就可以發(fā)現(xiàn)這個事實。當然了在scanf函數(shù)中,這兩者是有區(qū)別的。

對于問題2,也很簡單,2的二進制存儲形式按照浮點數(shù)方式解釋讀取時,就是該值。

對于問題3,double的有效位為15~16位,也就是之外的位數(shù)都是不可靠的。printf中的*可用于實現(xiàn)可變域?qū)捄途?,前面已?jīng)解釋過了。

對于問題4,這里不給出,留給讀者思考,歡迎大家可留言區(qū)給出原因。

對于問題5,雖然參數(shù)計算順序沒有規(guī)定,但是實際上至少對于gcc來說,它是從右往左計算的。也就是說,先計算a++,而a++是先用在加,即壓入a=4,其后,a的值變?yōu)?;再計算++a,先加再用,即壓入a=5+1=6;最后a=6,壓入棧。最終從左往右壓入棧的值就分別為6,6,4。也就是最終的打印結(jié)果。但是實際情況中,這樣的代碼絕對不該出現(xiàn)!

至此,真相大白。

總結(jié)

雖然我們前面解釋了那些難以理解的現(xiàn)象,同時讀者可以參考變長參數(shù)探究和對浮點數(shù)的一些理解找到更多的信息。但是我們在實際編程中應該注意以下幾點:

格式控制符應該與對應參數(shù)類型匹配或者與類型提升后的參數(shù)類型匹配。

絕對避免出現(xiàn)計算結(jié)果與參數(shù)計算順序有關(guān)的代碼。

*在printf中實現(xiàn)可變域?qū)捄途取?/p>

printf不會實際接受到char,short和float類型參數(shù)。

如果%s對應的參數(shù)可能為NULL或者對應整型,那將是一場災難。

不要忽略編譯器的任何警告,除非你很清楚你在做什么。

例外情況指的是有符號整型和無符號整型之間,以及void*和char*之間。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 打印
    +關(guān)注

    關(guān)注

    1

    文章

    68

    瀏覽量

    19323
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3849

    瀏覽量

    85493
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    14831
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    SMA接頭老化了只能報廢?分享幾個不知道的維護回春術(shù)

    SMA 連接器性能下降只能報廢?本文由德索精密工業(yè)(Dosin)技術(shù)專家分享四個鮮為人知的射頻接口“回春術(shù)”。從高純酒精深層除垢到阻抗穩(wěn)定性恢復,深度解析如何通過物理維護延長高頻跳線使用壽命。文章附帶詳細的維護效果評估表,助您在保障射頻系統(tǒng)精度的同時,大幅降低 B 端實驗室及工程現(xiàn)場的耗材成本。
    的頭像 發(fā)表于 04-29 15:36 ?327次閱讀
    SMA接頭老化了只能報廢?分享幾個<b class='flag-5'>你</b><b class='flag-5'>不知道</b>的維護回春術(shù)

    【文章轉(zhuǎn)載】不知道的Vector | VectorCAST/C++的AI輔助測試功能

    從2026版本開始,VectorCAST/C++推出首批AI輔助測試功能,旨在幫助開發(fā)團隊解決單元測試過程中的兩個核心難點:1.如何根據(jù)需求描述自動生成可驗證邏輯功能的單元測試用例(Req2test):基于自然語言需求輸入,利用大語言模型自動生成符合測試框架規(guī)范的測試用例代碼,減少手工編寫用例的工作量。2.如何基于現(xiàn)有代碼自動生成單元級別的需求規(guī)格說明(Co
    的頭像 發(fā)表于 04-29 10:03 ?259次閱讀
    【文章轉(zhuǎn)載】<b class='flag-5'>你</b><b class='flag-5'>不知道</b>的Vector | VectorCAST/C++的AI輔助測試功能

    SMB接頭老化了只能扔掉?分享幾個不知道的日常維護「回春術(shù)」

    SMB接頭老化失效只能換新?其實很多時候只是“假死”。本文由擁有10年一線經(jīng)驗的射頻工程師撰寫,深度分享SMB接頭的日常維護“回春術(shù)”。從診斷真假老化、無水乙醇精確清洗,到外導體彈性的物理復位技巧,全方位解析如何延長連接器使用壽命。結(jié)合德索連接器(Dosin)的精密加工與鈹青銅選材經(jīng)驗,手把手教你降低B端設(shè)備運維成本,解決信號跳變頑疾,純干貨分享,建議收藏。
    的頭像 發(fā)表于 04-27 15:06 ?86次閱讀
    SMB接頭老化了只能扔掉?分享幾個<b class='flag-5'>你</b><b class='flag-5'>不知道</b>的日常維護「回春術(shù)」

    PCB棕化工藝不同,高速信號損耗差老遠了!

    開著法拉利加92號汽油能不能跑得快我不知道,但是好的PCB銅箔遇到差的PCB棕化工藝損耗就一定會變大……
    的頭像 發(fā)表于 04-21 17:29 ?579次閱讀
    PCB棕化工藝不同,高速信號損耗差老遠了!

    PicoClaw v0.2.4 發(fā)布——迄今最大更新

    2026年3月25日PicoClaw團隊發(fā)布v0.2.4版本這次更新很大,大到我們自己都覺得,不說清楚可能不知道升級了什么所以這篇文章只說一件事:這次更新對意味著什么一、AI助手會"
    的頭像 發(fā)表于 03-26 12:04 ?567次閱讀
    PicoClaw v0.2.4 發(fā)布——迄今最大更新

    的EMC瓶頸,不是經(jīng)驗不夠,是體系不全

    EMC的EMC瓶頸,不是經(jīng)驗不夠,是體系不全現(xiàn)在的狀態(tài),是不是這樣?產(chǎn)品送測前,心里完全沒底,不知道哪一項會掛傳導發(fā)射超標,換了十幾種電容電感,還是壓不下去靜電打幾下,系統(tǒng)重啟,
    的頭像 發(fā)表于 03-10 16:41 ?487次閱讀
    <b class='flag-5'>你</b>的EMC瓶頸,不是經(jīng)驗不夠,是體系不全

    的導航早已“中國芯”:北斗如何靜默取代GPS,成為日常出行主力?

    四大全球衛(wèi)星系統(tǒng)深度對比+實測驗證指南當你說“打開導航”時,知道背后是哪顆“星辰”在為指引方向嗎?今天,我們將深入探討全球衛(wèi)星定位系統(tǒng)的格局,并揭示一個
    的頭像 發(fā)表于 02-05 19:33 ?1091次閱讀
    <b class='flag-5'>你</b>的導航早已“中國芯”:北斗如何靜默取代GPS,成為日常出行主力?

    組合導航不知道怎么選,看這里

    單一導航難適配復雜作業(yè)?MEMS組合導航來幫你,通過融合衛(wèi)星定位與慣性測量技術(shù),以“1+1>2”優(yōu)勢破解全行業(yè)導航難題。 我司組合導航提供三種方案可選,從01到03到05,搭載從導航級到戰(zhàn)術(shù)級到消費級MEMS陀螺儀與加速度計,通過微機電技術(shù)集成在毫米芯片上,搭載衛(wèi)星模塊以及其他器件,尺寸僅有65mm*70mm*45.5mm,以下是三種方案詳細介紹: 超高精度方案—ER-GNSS/MINS-01 產(chǎn)品定位 一款擁有測繪級超高精度的組合導航,是市面上采用MEMS技術(shù)組合導航系統(tǒng)中
    的頭像 發(fā)表于 01-08 15:47 ?390次閱讀

    斷電時,的后備電源真能啟動嗎?多數(shù)人不知道的UPS保養(yǎng)真相

    斷電那一刻,的后備電源真的能頂上嗎?深夜,機房警報突然響起,屏幕瞬間熄滅——不是演習,市電真的斷了。所有人的心都提到了嗓子眼,三秒后,服務器指示燈重新亮起,UPS電源的顯示屏穩(wěn)定地閃爍著運行
    的頭像 發(fā)表于 12-05 13:37 ?2010次閱讀
    斷電時,<b class='flag-5'>你</b>的后備電源真能啟動嗎?多數(shù)人<b class='flag-5'>不知道</b>的UPS保養(yǎng)真相

    使用MCU200T的板子能不能做RVSTAR上的實驗例子?

    手里只有一塊MCU200T的板子,看到老師做的RVSTAR上的例子,不知道能不能在MCU200T上面做
    發(fā)表于 11-05 12:55

    現(xiàn)在流行來中國看賽博朋克

    中國以外的人不知道中國有多強
    的頭像 發(fā)表于 10-10 22:43 ?4660次閱讀
    現(xiàn)在流行來中國看賽博朋克

    工業(yè)數(shù)據(jù)連接器的穩(wěn)定重要性不會不知道吧?

    我曾參與一家汽車零部件工廠的智能化改造項目,本以為升級設(shè)備就能大幅提升生產(chǎn)效率,卻因一時疏忽選用了穩(wěn)定性欠佳的工業(yè)數(shù)據(jù)連接器。試運行期間,生產(chǎn)線頻繁出現(xiàn)數(shù)據(jù)傳輸中斷,導致機械臂動作錯亂,生產(chǎn)出大量殘次品,直接經(jīng)濟損失高達數(shù)十萬元。這次教訓讓我深刻明白,在工業(yè)領(lǐng)域,數(shù)據(jù)連接器的穩(wěn)定容不得半點馬虎。 工業(yè)數(shù)據(jù)連接器,作為工業(yè)設(shè)備間數(shù)據(jù)交互的核心樞紐,其穩(wěn)定性決定著整個工業(yè)生產(chǎn)系統(tǒng)能否正常運轉(zhuǎn)。不同于普通消
    的頭像 發(fā)表于 07-03 16:32 ?683次閱讀

    關(guān)于OFDM 不知道的那些事?#OFDM #5G技術(shù) #通信技術(shù)

    通信技術(shù)
    安泰儀器維修
    發(fā)布于 :2025年06月24日 18:31:22

    編譯錯誤: error: unrecognizable insn,不知道原因,請教!

    用start_gui.exe生成的代碼,再用SEGGER Embedded打開,編譯有錯,不知道是什么原因,請教各位大佬?
    發(fā)表于 06-23 14:45

    瑞薩RA單片機在e2 studio環(huán)境下printf編譯出錯的問題解析

    最近看到有一些網(wǎng)友在討論關(guān)于:瑞薩RA單片機在e2 studio環(huán)境下printf編譯出錯的問題。
    的頭像 發(fā)表于 05-24 15:51 ?1762次閱讀
    瑞薩RA單片機在e2 studio環(huán)境下<b class='flag-5'>printf</b>編譯出錯的問題解析
    四子王旗| 乐亭县| 宁城县| 茶陵县| 桓台县| 天祝| 天门市| 邯郸市| 赤壁市| 旌德县| 桂林市| 肥乡县| 左云县| 水富县| 叙永县| 京山县| 当涂县| 全州县| 南开区| 吉首市| 吉林省| 阳西县| 德保县| 甘谷县| 南丰县| 古田县| 社会| 安图县| 东安县| 东阿县| 革吉县| 精河县| 曲松县| 蚌埠市| 安远县| 新安县| 民丰县| 北碚区| 施甸县| 荔浦县| 龙州县|