簡體   English   中英

C,*和/以及%運算符優先級如何工作?

[英]How does operator precedence grouping work in C for *, /, and %?

關於C的O'Reilly袖珍參考,對於*/%運算符的分組的描述,我有些困惑。 這本書說分組從左到右進行-現在我想將分組與評估順序相混淆。 鑒於以下等式,以及從書中建立的規則,我本以為...

int x = 4 / 3 * -3

...的值為0 ,因為...

1: 4 / 3 * -3
2: 4 / -9
3: 0

...但是,實際上它的計算結果為-3 ,並且似乎使用了此方法...

1: 4 / 3 * -3
2: 1 * -3
3: -3

這是為什么?

對於我,這說得通:

int x = 4 / 3 * -3;

從左到右分組,我們得到:

int x = (4 / 3) * -3
int x = ((4 / 3) * -3);

另請參見優先級表 它們具有相同的優先級,因此它們從左到右綁定。

您需要知道運算符的優先級關聯性。

乘法(*)的優先級高於加法(+),這就是為什么在C語言和普通數學中2 + 3 * 4都被解釋為2+(3 * 4)的原因。 但是在2 * 3/4或2 * 3 * 4之類的表達式中,運算符的優先級都相同,因此您需要查看關聯性。 對於大多數運算符,它從左到右,這意味着您從左開始分組:2 * 3/4變成(2 * 3)/ 4,2 * 3 * 4 * 5變成((2 * 3)* 4 )* 5,依此類推。

例外是賦值,它是C中的運算符。賦值是右關聯的,因此a = b = 3應該讀作a =(b = 3)。

任何好的C書籍或教程都應該有一張所有運算符的表(例如this ),具有優先級和關聯性。

訪問以下URL。 它對C語言中的所有主題都非常有用。因此,您也可以使用運算符優先級。

 http://www.goldfish.org/books/The%20C%20Programming%20Language%20-%20K&R/chapter2.html#s2.12

在這里,它與系統識別相關聯。 因此,它將僅執行第二個示例以評估表達式。

恕我直言,最好知道這些運算符的優先級,但是最好在有疑問時使用括號:-)。 就像大師所說的那樣,對於人類讀者而言,代碼比對機器而言更多。 如果作者不確定,讀者也不會。

這些 鏈接應該可以幫助您。

乘法和除法保持關聯,因此發生的是第二順序-運算分組為(4/3),然后將結果乘以-3。

對於數學,C的工作原理就像您在高學中學習的一樣。 記住BODMAS(除法,乘法,加法和減法括號)。 這意味着它將從左到右尋找一​​個計算。 在這種情況下,它將看到4/3並計算答案,然后將答案乘以-3。 您可以使用方括號將其修復( 4/(3*-3) )。 請查看此頁面 ,以摘要了解C如何對運算符進行排序並執行計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM