找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3000|回復(fù): 28
打印 上一主題 下一主題
收起左側(cè)

C語(yǔ)言運(yùn)算符優(yōu)先級(jí)問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

程序排查錯(cuò)誤過程中發(fā)現(xiàn)tx=0,思考半天包括查運(yùn)算符優(yōu)先級(jí)也沒搞明白為啥tx會(huì)是0,特來請(qǐng)教。

  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. }
復(fù)制代碼



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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

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

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

keil 5.32   stm32運(yùn)行結(jié)果是0.
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

10#
ID:146878 發(fā)表于 2023-11-8 22:37 | 只看該作者
ARM平臺(tái)的C語(yǔ)言是不支持吧負(fù)數(shù)浮點(diǎn)強(qiáng)制轉(zhuǎn)換成無符號(hào)類型的。
回復(fù)

使用道具 舉報(bào)

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



回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

13#
ID:628113 發(fā)表于 2023-11-9 14:35 | 只看該作者
KEIL 5 , ARM 版本 實(shí)際運(yùn)行結(jié)果 :
void tttt(void)
{
        float k=364.4;
        float belta=2;
        unsigned int tx;
        tx=(unsigned int) -k*belta;
   DebugOut("tx= %d",tx);

}
結(jié)果:
=======  Ready.  =======
tx= 728

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

15#
ID:1091344 發(fā)表于 2023-11-10 16:15 | 只看該作者
tx定義的是無符號(hào)的整型,后面計(jì)算結(jié)果是負(fù)的,強(qiáng)制類型轉(zhuǎn)換把負(fù)的轉(zhuǎn)成了無符號(hào)整型0
回復(fù)

使用道具 舉報(bào)

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

俺也一樣
回復(fù)

使用道具 舉報(bào)

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

ARM平臺(tái)的問題,X86,C51是可以的。
回復(fù)

使用道具 舉報(bào)

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

ARM平臺(tái)不知道比51高到哪里去了,怎么可能會(huì)有這種低級(jí)錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

21#
ID:1091094 發(fā)表于 2023-11-13 17:47 | 只看該作者
coody_sz 發(fā)表于 2023-11-13 11:30
不要吝嗇括號(hào)。

我在VS2020試過了,為什么加括號(hào)就可以呢?
加括號(hào)改變了什么,把flaot類型轉(zhuǎn)換成int或者unsigned int 類型了嗎?
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

你親自驗(yàn)證一下,不要拍腦袋亂說。
回復(fù)

使用道具 舉報(bào)

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

65535+1=0
這又是怎么回事???
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表