2016-04-01 47 views
-6

假设你有一个INT指针变量,int* q = malloc(sizeof(int))优先似乎在printf的改变

现在这样

*q++; 

q将指向其它一些内存位置,因为++有优先的权利

然而,在printf中做同样的事情

printf("%d",*q++); 

给出了解引用(*)运算符的优先级?

+5

我会避免编写依赖于细微语言规则,你很可能会忘记的代码。是否浪费时间来编写'printf(“%d”,* q); q ++;'? –

+3

[运算符优先顺序](http://en.cppreference.com/w/c/language/operator_precedence)是固定的,除非编译器解析器中存在非常糟糕的错误(这是极不可能的)。你能否请尝试创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示?并告诉我们期望的*和*实际产出。如果您收到编译器错误或警告,您应该显示它们,完整,未经编辑并包含任何可能的信息说明。 –

+0

@MathiasDolidon:Postfix vs.前缀不是*那*微妙,它是后缀记法的整点...... – DevSolar

回答

0

当++在变量之后时,在评估指令后进行增量:printf("%d",*q++);就像printf("%d",*q), ++q;

所以printf打印“好”号码,然后指针失效,但优先顺序不变。在这两种情况下都是一样的,但在第一种情况下,解除引用不起作用。

3

++是后缀增量。它优先于一元*

结果的值计算在更新操作数的存储值的侧 效果之前测序:然而,更新变量的副作用的变量评价(6.5.2.4)之后完成。

因此*q++总会给你的*q的价值,无论它是在你的代码中使用。

这是前缀和后缀增量的区别。 *++q会首先增加指针,然后评估新地址的值。

1

有两个运算符定义增量 - 前和后增量 - 他们都返回一个值!这是因为如果你调用的函数:

printf("%d", *f(q)); 

的预增量操作第一增量,并返回新值时,后置运算符返回值和增量事后

好的,这只是用于说明 - 从技术上说,返回后它不能递增,因此它记住了初始值,然后递增并返回记住的值。这是,顺便说一句,前增量比后增量更有效的原因,除非编译器优化差异...

+0

使用函数作为类比可能不是一个好主意,因为C中的函数调用包含一个序列点。这意味着在函数被调用之前,所有的副作用都会被评估。此外,预增量并不更有效率,这是20世纪80年代的一个古老神话。 (除非你正在编写C++)[看这里](http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c/26482954#26482954) 。 – Lundin

+0

我认为,如果有人问为什么* q ++导致它的结果,我们处于一个水平,其功能类比工作得很好,只是为了理解,而序列点则是以后要应对的更高级的主题......而问题实际上也被标记为C++ ... – Aconcagua

相关问题