久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: C語言運算符優先級問題 [打印本頁]

作者: lei848200    時間: 2023-11-7 23:01
標題: C語言運算符優先級問題

程序排查錯誤過程中發現tx=0,思考半天包括查運算符優先級也沒搞明白為啥tx會是0,特來請教。

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         float k=364.4;
  5.         float belta=2;
  6.         unsigned int tx;
  7.         tx=(unsigned int) -k*belta;
  8.    printf("tx= %d  \n",tx);
  9.    return 0;
  10. }
復制代碼




作者: Y_G_G    時間: 2023-11-7 23:47
我到現在都還沒有能完全記住C的運算優先等級,有事沒事就是括號!
作者: Hephaestus    時間: 2023-11-8 01:10
我用MinGW驗證了一下,結果是-512,所以根本就不是什么優先級的問題,而是不同類型格式轉換的問題。
作者: npn    時間: 2023-11-8 08:10
你要搞清楚是多少位的編譯器,不同的數據類型位寬可能不一樣。
作者: 200404    時間: 2023-11-8 09:11
如果您在程序排查過程中發現了一個變量的值為0,那么可能有多種原因導致了這種情況。可能是您的代碼將該變量初始化為0,也可能是您的代碼在某個地方將該變量的值修改為0。以下是一些可能導致變量值為0的情況:  變量初始化:在很多編程語言中聲明的變量默認為0. 如果在聲明變量時未給定任何初始值,則該變量將被初始化為0。  賦值為0:如果變量在代碼的某個位置被顯式地賦值為0,則該變量的值將會變為0. 如果tx被賦值為0,會導致tx=0.  程序中的錯誤:tx被連續多次運算可能導致變量的值為0. 可以通過調試程序并添加日志來確定變量值為0的實際原因。  運算符優先級:如果tx變量是由某個表達式計算得出的,則可能是由于運算符的優先級錯誤,導致tx的計算結果為0. 可以檢查代碼的計算表達式是否含有錯誤的優先級,以及各個操作數是否正確。
作者: 200404    時間: 2023-11-8 09:12
如果您在程序排查過程中發現了一個變量的值為0,那么可能有多種原因導致了這種情況。可能是您的代碼將該變量初始化為0,也可能是您的代碼在某個地方將該變量的值修改為0。以下是一些可能導致變量值為0的情況:

變量初始化:在很多編程語言中聲明的變量默認為0. 如果在聲明變量時未給定任何初始值,則該變量將被初始化為0。

賦值為0:如果變量在代碼的某個位置被顯式地賦值為0,則該變量的值將會變為0. 如果tx被賦值為0,會導致tx=0.

程序中的錯誤:tx被連續多次運算可能導致變量的值為0. 可以通過調試程序并添加日志來確定變量值為0的實際原因。

運算符優先級:如果tx變量是由某個表達式計算得出的,則可能是由于運算符的優先級錯誤,導致tx的計算結果為0. 可以檢查代碼的計算表達式是否含有錯誤的優先級,以及各個操作數是否正確。

作者: 1600277881    時間: 2023-11-8 11:16
tx=(unsigned int) ((float)-k*belta);
作者: lei848200    時間: 2023-11-8 12:41
npn 發表于 2023-11-8 08:10
你要搞清楚是多少位的編譯器,不同的數據類型位寬可能不一樣。

keil 5.32   stm32運行結果是0.
作者: Hephaestus    時間: 2023-11-8 13:54
lei848200 發表于 2023-11-8 12:41
keil 5.32   stm32運行結果是0.

那么就可能是優化掉了,編譯器認為你的代碼沒用,實際上未生成有效機器碼。
作者: pdwdzz    時間: 2023-11-8 22:37
ARM平臺的C語言是不支持吧負數浮點強制轉換成無符號類型的。
作者: cnos    時間: 2023-11-9 09:56
我并沒有發現什么問題。tx并不是0




作者: aayon1979    時間: 2023-11-9 10:30
最簡單的方法就是帶括號,而且不出錯
作者: ppcbug    時間: 2023-11-9 14:35
KEIL 5 , ARM 版本 實際運行結果 :
void tttt(void)
{
        float k=364.4;
        float belta=2;
        unsigned int tx;
        tx=(unsigned int) -k*belta;
   DebugOut("tx= %d",tx);

}
結果:
=======  Ready.  =======
tx= 728

我懷疑是 你的編譯器 配置 【禁止】 浮點 計算, 所以導致 所有浮點數 都視為0.

作者: gwa    時間: 2023-11-9 15:59
一個是輸出類型是整型的,還有一個    tx=(unsigned int) (-k*belta);然后輸出
作者: 會飛的魚KKK    時間: 2023-11-10 16:15
tx定義的是無符號的整型,后面計算結果是負的,強制類型轉換把負的轉成了無符號整型0
作者: chxelc    時間: 2023-11-10 17:10
Y_G_G 發表于 2023-11-7 23:47
我到現在都還沒有能完全記住C的運算優先等級,有事沒事就是括號!

俺也一樣
作者: pdwdzz    時間: 2023-11-12 15:04
cnos 發表于 2023-11-9 09:56
我并沒有發現什么問題。tx并不是0

ARM平臺的問題,X86,C51是可以的。
作者: Hephaestus    時間: 2023-11-12 20:31
pdwdzz 發表于 2023-11-12 15:04
ARM平臺的問題,X86,C51是可以的。

ARM平臺不知道比51高到哪里去了,怎么可能會有這種低級錯誤。
作者: pdwdzz    時間: 2023-11-12 22:31
Hephaestus 發表于 2023-11-12 20:31
ARM平臺不知道比51高到哪里去了,怎么可能會有這種低級錯誤。

這又不是什么bug,一個編譯器特性而已。ARM的編譯器是不能直接吧負浮點數轉無符號的,官方文檔有說明的。
作者: coody_sz    時間: 2023-11-13 11:30
不要吝嗇括號。
作者: 3038838599    時間: 2023-11-13 17:47
coody_sz 發表于 2023-11-13 11:30
不要吝嗇括號。

我在VS2020試過了,為什么加括號就可以呢?
加括號改變了什么,把flaot類型轉換成int或者unsigned int 類型了嗎?
作者: 3038838599    時間: 2023-11-13 17:49
Hephaestus 發表于 2023-11-8 01:10
我用MinGW驗證了一下,結果是-512,所以根本就不是什么優先級的問題,而是不同類型格式轉換的問題。

那為什么是加了括號就正常了呢?
tx=(unsigned int) (-k*belta);
作者: 大漠落日    時間: 2023-11-15 10:48
加上萬能的括號,完工
作者: Hephaestus    時間: 2023-11-15 22:03
pdwdzz 發表于 2023-11-12 22:31
這又不是什么bug,一個編譯器特性而已。ARM的編譯器是不能直接吧負浮點數轉無符號的,官方文檔有說明的。

我用RVMDK試了一下,不支持你的說法,這是從哪個文檔看來的?
作者: 3038838599    時間: 2023-11-20 20:13
我想說一下這確實是運算符優先級的問題,強制類型轉換也是一個運算符,所以先強制類型轉換-K,再算*belta
作者: suncat0504    時間: 2023-11-20 22:54
好家伙,硬要把負的浮點數據轉換為無符號整形,那結果不是0還是啥數據?
作者: suncat0504    時間: 2023-11-20 22:55
無符號數據是從0開始的,負的數據咋轉換成無符號數呢?
作者: Hephaestus    時間: 2023-11-21 14:05
suncat0504 發表于 2023-11-20 22:54
好家伙,硬要把負的浮點數據轉換為無符號整形,那結果不是0還是啥數據?

你親自驗證一下,不要拍腦袋亂說。
作者: Hephaestus    時間: 2023-11-21 14:06
suncat0504 發表于 2023-11-20 22:55
無符號數據是從0開始的,負的數據咋轉換成無符號數呢?

65535+1=0
這又是怎么回事???




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产在线小视频 | 亚欧在线观看 | 午夜av在线播放 | 久草免费在线观看视频 | 中文av字幕 | 日韩黄色网址 | 欧美美女视频 | 中文字幕亚洲欧美 | 五月综合色 | 日本综合久久 | 老司机免费福利视频 | 一本在线| 东北少妇bbbb搡bbb搡 | 日韩av手机在线 | 可以看毛片的网站 | av在线免费播放 | 国产成人免费视频 | a在线免费观看 | 日本免费在线观看视频 | 一级片在线播放 | 国产精品久久久久久无人区 | 亚洲天码中字 | av网站观看 | 91精品国产综合久久久久久 | 在线日韩一区 | 日韩av在线网址 | 一级黄色录像视频 | 精品国产va久久久久久久 | 国产精品久久久久久久免费看 | 亚洲一区二区 | 日本不卡在线 | 亚洲成人天堂 | 精品久久一区二区三区 | 亚洲成人一区二区 | 国产日本在线 | 欧美久久久久久久久 | 中文字幕高清在线 | 精品蜜桃一区二区三区 | 国产裸体永久免费视频网站 | 欧美日韩国 | 日韩黄色片|