我对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))++
?它非常令人困惑。是否有任何标准规则来解决此问题。
答案 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 Leffler的answer。
我还建议您阅读@ 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)
前缀增量和后缀增量有很多技巧 作为程序员,您不需要花太多时间在这些技巧上,只需在代码中使用括号来显示计算顺序。