运营商的执行顺序

时间:2013-10-08 11:54:41

标签: c pointers

我对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 个答案:

答案 0 :(得分: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 Leffleranswer

我还建议您阅读@ Eric Lippert回答:Incrementing Pointers, Exact Sequence以了解++*运算符表达式,了解编译器如何在低级别执行它。

答案 1 :(得分:2)

  

我对http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm中的运算符优先级表给出了疑问。这个表中从右到左,从左到右的含义是什么?

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

x + y * z

然后*优先级更高,所以它获胜,这是:

x + (y * z)

(x + y) * z

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

x + y - z 

(x + y) - z

而不是

x + (y - z)

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

  

我想知道运营商将以什么顺序应用此代码。 --*p++

好吧,按照图表。我们有*,前缀减量和后缀增量。首先查阅优先级表。后缀增量优先于其他两个,因此自动为--*(p++)。现在我们不需要查阅表格来解决剩下的问题;显然唯一可能的括号是--(*(p++))

答案 2 :(得分: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++;

答案 3 :(得分:0)

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