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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2886|回復: 28
打印 上一主題 下一主題
收起左側

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. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:401564 發表于 2023-11-7 23:47 | 只看該作者
我到現在都還沒有能完全記住C的運算優先等級,有事沒事就是括號!
回復

使用道具 舉報

板凳
ID:883242 發表于 2023-11-8 01:10 | 只看該作者
我用MinGW驗證了一下,結果是-512,所以根本就不是什么優先級的問題,而是不同類型格式轉換的問題。
回復

使用道具 舉報

地板
ID:57657 發表于 2023-11-8 08:10 | 只看該作者
你要搞清楚是多少位的編譯器,不同的數據類型位寬可能不一樣。
回復

使用道具 舉報

5#
ID:1098734 發表于 2023-11-8 09:11 | 只看該作者
如果您在程序排查過程中發現了一個變量的值為0,那么可能有多種原因導致了這種情況。可能是您的代碼將該變量初始化為0,也可能是您的代碼在某個地方將該變量的值修改為0。以下是一些可能導致變量值為0的情況:  變量初始化:在很多編程語言中聲明的變量默認為0. 如果在聲明變量時未給定任何初始值,則該變量將被初始化為0。  賦值為0:如果變量在代碼的某個位置被顯式地賦值為0,則該變量的值將會變為0. 如果tx被賦值為0,會導致tx=0.  程序中的錯誤:tx被連續多次運算可能導致變量的值為0. 可以通過調試程序并添加日志來確定變量值為0的實際原因。  運算符優先級:如果tx變量是由某個表達式計算得出的,則可能是由于運算符的優先級錯誤,導致tx的計算結果為0. 可以檢查代碼的計算表達式是否含有錯誤的優先級,以及各個操作數是否正確。
回復

使用道具 舉報

6#
ID:1098734 發表于 2023-11-8 09:12 | 只看該作者
如果您在程序排查過程中發現了一個變量的值為0,那么可能有多種原因導致了這種情況。可能是您的代碼將該變量初始化為0,也可能是您的代碼在某個地方將該變量的值修改為0。以下是一些可能導致變量值為0的情況:

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

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

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

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

使用道具 舉報

7#
ID:1088185 發表于 2023-11-8 11:16 | 只看該作者
tx=(unsigned int) ((float)-k*belta);
回復

使用道具 舉報

8#
ID:1041695 發表于 2023-11-8 12:41 來自手機 | 只看該作者
npn 發表于 2023-11-8 08:10
你要搞清楚是多少位的編譯器,不同的數據類型位寬可能不一樣。

keil 5.32   stm32運行結果是0.
回復

使用道具 舉報

9#
ID:883242 發表于 2023-11-8 13:54 | 只看該作者
lei848200 發表于 2023-11-8 12:41
keil 5.32   stm32運行結果是0.

那么就可能是優化掉了,編譯器認為你的代碼沒用,實際上未生成有效機器碼。
回復

使用道具 舉報

10#
ID:146878 發表于 2023-11-8 22:37 | 只看該作者
ARM平臺的C語言是不支持吧負數浮點強制轉換成無符號類型的。
回復

使用道具 舉報

11#
ID:688692 發表于 2023-11-9 09:56 | 只看該作者
我并沒有發現什么問題。tx并不是0



回復

使用道具 舉報

12#
ID:146782 發表于 2023-11-9 10:30 | 只看該作者
最簡單的方法就是帶括號,而且不出錯
回復

使用道具 舉報

13#
ID:628113 發表于 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.
回復

使用道具 舉報

14#
ID:1099117 發表于 2023-11-9 15:59 | 只看該作者
一個是輸出類型是整型的,還有一個    tx=(unsigned int) (-k*belta);然后輸出
回復

使用道具 舉報

15#
ID:1091344 發表于 2023-11-10 16:15 | 只看該作者
tx定義的是無符號的整型,后面計算結果是負的,強制類型轉換把負的轉成了無符號整型0
回復

使用道具 舉報

16#
ID:712097 發表于 2023-11-10 17:10 | 只看該作者
Y_G_G 發表于 2023-11-7 23:47
我到現在都還沒有能完全記住C的運算優先等級,有事沒事就是括號!

俺也一樣
回復

使用道具 舉報

17#
ID:146878 發表于 2023-11-12 15:04 | 只看該作者
cnos 發表于 2023-11-9 09:56
我并沒有發現什么問題。tx并不是0

ARM平臺的問題,X86,C51是可以的。
回復

使用道具 舉報

18#
ID:883242 發表于 2023-11-12 20:31 | 只看該作者
pdwdzz 發表于 2023-11-12 15:04
ARM平臺的問題,X86,C51是可以的。

ARM平臺不知道比51高到哪里去了,怎么可能會有這種低級錯誤。
回復

使用道具 舉報

19#
ID:146878 發表于 2023-11-12 22:31 | 只看該作者
Hephaestus 發表于 2023-11-12 20:31
ARM平臺不知道比51高到哪里去了,怎么可能會有這種低級錯誤。

這又不是什么bug,一個編譯器特性而已。ARM的編譯器是不能直接吧負浮點數轉無符號的,官方文檔有說明的。
回復

使用道具 舉報

20#
ID:1034262 發表于 2023-11-13 11:30 | 只看該作者
不要吝嗇括號。
回復

使用道具 舉報

21#
ID:1091094 發表于 2023-11-13 17:47 | 只看該作者

我在VS2020試過了,為什么加括號就可以呢?
加括號改變了什么,把flaot類型轉換成int或者unsigned int 類型了嗎?
回復

使用道具 舉報

22#
ID:1091094 發表于 2023-11-13 17:49 | 只看該作者
Hephaestus 發表于 2023-11-8 01:10
我用MinGW驗證了一下,結果是-512,所以根本就不是什么優先級的問題,而是不同類型格式轉換的問題。

那為什么是加了括號就正常了呢?
tx=(unsigned int) (-k*belta);
回復

使用道具 舉報

23#
ID:195496 發表于 2023-11-15 10:48 | 只看該作者
加上萬能的括號,完工
回復

使用道具 舉報

24#
ID:883242 發表于 2023-11-15 22:03 | 只看該作者
pdwdzz 發表于 2023-11-12 22:31
這又不是什么bug,一個編譯器特性而已。ARM的編譯器是不能直接吧負浮點數轉無符號的,官方文檔有說明的。

我用RVMDK試了一下,不支持你的說法,這是從哪個文檔看來的?
回復

使用道具 舉報

25#
ID:1091094 發表于 2023-11-20 20:13 | 只看該作者
我想說一下這確實是運算符優先級的問題,強制類型轉換也是一個運算符,所以先強制類型轉換-K,再算*belta
回復

使用道具 舉報

26#
ID:517466 發表于 2023-11-20 22:54 | 只看該作者
好家伙,硬要把負的浮點數據轉換為無符號整形,那結果不是0還是啥數據?
回復

使用道具 舉報

27#
ID:517466 發表于 2023-11-20 22:55 | 只看該作者
無符號數據是從0開始的,負的數據咋轉換成無符號數呢?
回復

使用道具 舉報

28#
ID:883242 發表于 2023-11-21 14:05 | 只看該作者
suncat0504 發表于 2023-11-20 22:54
好家伙,硬要把負的浮點數據轉換為無符號整形,那結果不是0還是啥數據?

你親自驗證一下,不要拍腦袋亂說。
回復

使用道具 舉報

29#
ID:883242 發表于 2023-11-21 14:06 | 只看該作者
suncat0504 發表于 2023-11-20 22:55
無符號數據是從0開始的,負的數據咋轉換成無符號數呢?

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩毛片免费看 | 国产精品www | 黄色一级在线播放 | 亚洲免费精品 | 久久99蜜桃综合影院免费观看 | 国产成人99av超碰超爽 | 日韩www视频 | 欧美精品一区二区在线观看 | 午夜国产 | 久久精品视频免费看 | 国产不卡在线观看 | 激情五月激情综合网 | 热久久久久 | www国产精品 | 精品视频 免费 | 成人精品视频在线观看 | av网站在线播放 | 日本欧美国产 | 99在线精品视频 | 精品麻豆剧传媒av国产九九九 | 久久综合一区 | 成人精品一区二区三区 | 青青久久av北条麻妃海外网 | 韩国欧洲一级毛片 | 欧美精品在欧美一区二区少妇 | 久久精品久久精品 | 亚洲一区二区在线 | 国产婷婷色一区二区三区 | 日韩在线观看一区 | 亚洲第一av| 九色av| 色视频网站 | 国产一区二区精品在线 | 九九热精品在线 | 精品伊人| 99热.com | 天天综合干 | 国产午夜精品一区二区三区四区 | 91精品中文字幕一区二区三区 | 97天天干 | 亚洲天堂一区 |