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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C語言運算符優(yōu)先級問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1041695 發(fā)表于 2023-11-7 23:01 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

程序排查錯誤過程中發(fā)現(xiàn)tx=0,思考半天包括查運算符優(yōu)先級也沒搞明白為啥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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

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

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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



回復

使用道具 舉報

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

使用道具 舉報

13#
ID:628113 發(fā)表于 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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

俺也一樣
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情久久网| 日韩在线一区二区 | 日韩国产中文字幕 | 色婷婷精品国产一区二区三区 | 热99| 久久久久久久国产精品影院 | 91看片网 | 成人久久久 | 91成人在线 | 欧美久久久 | 九九综合| 国产专区视频 | 91精品成人久久 | 亚洲午夜精品一区二区三区他趣 | 综合精品在线 | 91久久久久久久久久久久久 | 成年人在线视频 | 国产欧美精品一区二区 | 国外成人免费视频 | 午夜一级做a爰片久久毛片 精品综合 | 亚洲精品不卡 | 综合色在线 | 欧美一区二区三区的 | 欧美一级片免费看 | 久久99精品视频 | 日韩免费一区 | 欧美日韩精品一区二区三区四区 | 男人的天堂久久 | 天天综合网永久 | 日韩高清一区二区 | 日韩中文字幕免费 | 欧美一区二区成人 | 亚洲精品在线免费观看视频 | 国产精品免费一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 成人一区av| 欧美久久国产精品 | 在线免费观看视频你懂的 | 亚洲精品一区二区三区蜜桃久 | 色综合网站 | 欧美激情亚洲激情 |