-1
int main()
{
    int value = 4321;
    int *ptrVal = &value;
    printf("%d %d",++value,(*(int*)ptrVal)--);
    return 0;
}

上述打印语句中的预增量/后增量如何工作?

为什么答案是 4321 4321 ?

4

2 回答 2

3

您正在两个序列点之间修改对象value两次:您正在调用未定义的行为。未定义的行为意味着您的程序可以打印4321 4321、打印42甚至崩溃。

您的程序的正确版本是:

int value = 4321;
int *ptrVal = &value;

++value;
(*ptrVal)--;  // no need to cast to int *

printf("%d %d", value, *ptrVal);  // same as printf("%d %d", value, value);

当然,您不需要任何临时指针来实现这一点。

于 2013-06-10T18:50:44.953 回答
1

上面的代码只是坏了。未指定它将如何工作或答案将是什么。您需要在修改或修改和访问之间有一个序列点。

于 2013-06-10T18:50:22.053 回答