2

我对http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm中给出的运算符优先级表感到困惑

我的意思是从右到左和从左到右。

我想知道我们将在此代码上应用运算符的顺序。

int main()
{
   int i[] = {3, 5}; 
   int *p = i; 
   int j = --*p++; 

   printf("j = %d\n\n", j);
   system("pause");
   return 0;
}

是这样 --(*(p++))吗?还是(--(*p))++?它非常混乱。有没有解决这个问题的标准规则。

4

4 回答 4

4

表达方式:

j = --*p++;

相当于:

j = --*p;  // first decrements value pointed by p, then assign value pointer by p to j
p++;       // increment p to point to next location

您的表达式的括号版本应该是:--(*(p++));阅读@Jonathan Leffler回答

我还建议您阅读@ Eric Lippert的答案:增量指针,精确序列以理解编译器如何在低级别执行它的运算符表达式++*

于 2013-10-08T11:56:42.457 回答
2

我对http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm中给出的运算符优先级表感到困惑。这张表中从右到左和从左到右是什么意思?

优先级和关联性决定了括号如何在逻辑上插入到括号不足的表达式中。如果你有

x + y * z

then*是更高的优先级,所以它获胜,这是:

x + (y * z)

不是

(x + y) * z

如果您有两个具有相同优先级的运算符,那么哪一个获胜取决于关联性。 +并且-具有相同的优先级并且具有从左到右的关联性,所以

x + y - z 

(x + y) - z

并不是

x + (y - z)

具有从右到左结合性的运算符首先将括号放在最右边的表达式上。

我想知道我们将在此代码上应用运算符的顺序。--*p++

好吧,按照图表。我们有*, 前缀递减和后缀递增。请先查阅优先级表。后缀增量的优先级高于其他两个,因此自动为--*(p++). 现在我们不需要查阅表格来计算其余部分;显然唯一可能的括号是--(*(p++)).

于 2013-10-08T22:33:30.330 回答
1

++--前缀从右到左递增/递减,后来你发现*

j = --*p++;  

上面的语句按照优先级--将首先执行。所以在表达式--中是先递减*p,然后++是后递增,将递增指针p

j= --*p; //and immediately do *p++ == p++ , because here ++ got priority. and this is post decrement this wont assign to j.this as same as incrementing p value in next statement. 
p++;
于 2013-10-08T12:09:43.287 回答
0

前缀增量和后缀增量有很多技巧。
作为程序员,你不需要花太多时间在这些技巧上,只需在代码中使用括号来显示计算顺序即可。

于 2013-10-08T12:09:35.843 回答