后增量的优先顺序

时间:2017-01-26 12:37:31

标签: c operator-precedence

任何人都可以解释以下代码的输出和原因吗?

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

   int j = --*p++;

   printf("%d\n%d\n", j,*p);

   system("pause");
   return 0;
}

1 个答案:

答案 0 :(得分:1)

我实际上是要回答这个问题,即使这是真的" OP只需要编译代码并运行它",因为它不是对于初学者来说显而易见的是,这个给出正确答案的案例之一。人们总是在这个网站上获得惊慌,因为他们会问为什么表面上相似的代码( 有未定义的行为)给出了一个令人惊讶的答案。

navigationController.pushViewController(viewController, animated: true)

装置

int j = --*p++;

即,int j = *p - 1; *p = j; p += 1; *p 指向的值)递减,递减的值写入p,然后{{1本身增加。

此处没有未定义的行为,因为原始表单中的jp运算符作用于两个不同的数据对象。由于多次使用副作用运算符而具有未定义行为的表达式都涉及在同一表达式中修改相同数据对象两次("没有插入序列点")。

(如果您想知道为什么 --适用于++,但--仅适用于*p,是的,因为那是语言的语法所说的。抱歉,这只是你必须记住的事情之一。")