我有這個代碼:
#include <stdio.h>
void f(int* n){
*n ;
}
int main() {
int n= 1;
f(&n);
printf("%d\n", n);
return 0;
}
的值n不變。如果我想更改 的值,n我必須這樣做:
#include <stdio.h>
void f(int* n){
(*n) ;
}
int main() {
int n= 1;
f(&n);
printf("%d\n", n);
return 0;
}
為什么括號如此重要,這兩行代碼有什么區別?
*n ;
(*n) ;
uj5u.com熱心網友回復:
這是設計使然。后綴運算子的優先級 高于指標解參考運算子*。因此編譯器將解釋*n 為*(n ). 要更改應用運算子的順序,您必須使用括號。
要清楚差異:
*n遞增指標,回傳原始指標并取消參考它,這不會改變它指向的整數。它本質上是一個“無操作”,任何半體面的編譯器都會優化你的整個函式,因為它什么都不做。(*n)取消參考指標并增加它指向的整數,這正是您想要的。
你可以在這里找到一個完整的表格:C Operator Precedence
與往常一樣,巧妙地添加括號通常不會有什么壞處,即使它捕獲的順序與語言指定的相同。這是對任何閱讀您代碼的人的禮貌。
uj5u.com熱心網友回復:
因為
void f(int* n){
*n ;
}
是相同的
void f(int* n){
n ; // increment of local (stack) variable.
*n; // reads undefined memory which is foolish but harmless in this instance
}
并且顯然毫無意義(如果您原諒雙關語。)
uj5u.com熱心網友回復:
運算子優先級表
(TR)sa?dan sola = (EN)從右到左
(TR)soldan sa?a = (EN)從左到右
信用:Necati Ergin
對于您的問題的答案,您應該學習運算子優先級表。括號位于優先級表的頂部。
遞增運算子和間接運算子具有相同的優先級。但是這個級別的優先方向是從右到左。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506475.html
上一篇:ORM增刪改查并發性能測驗2
