【发布时间】:2013-04-29 09:57:32
【问题描述】:
示例 7 表达式的分组并不能完全确定它的求值。在以下片段中:
#include <stdio.h> int sum; char *p; /* ... */ sum = sum * 10 - '0' + (*p++ = getchar());表达式语句被分组,就像它被写成一样
sum = (((sum * 10) - '0') + ((*(p++)) = (getchar())));但是 p 的实际增量可以发生在前一个序列点和下一个序列点( ; )之间的任何时间,并且对 getchar 的调用可以在需要其返回值之前的任何时间发生。
所以基本上我将其理解为 未指定的行为 - *p = getchar(); p++; 或 p++; *p = getchar()。注意;暗示了一个序列点,但整个表达式中没有其他序列点。
所以这个语法是没用的。而且,对于指针赋值,++ 和 -- 几乎是没用的。 对吗?
【问题讨论】:
-
p++后增量何时发生并不重要,因为 p 在表达式中只计算一次。 -
在
(*p++ = getchar())中,p++只是一个副作用,p永远不会在同一语句中的第二个位置引用,所以p++不能导致序列点错误。 (除非它指向sum,或标准输入文件缓冲区内的某个位置) -
将
p* = getchar()更改为*p = getchar()
标签: c sequence-points