3

§5.1.2.4.16

例 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();はシーケンス ポイントを意味しますが、式全体に他のシーケンス ポイントがないことに注意してください。

したがって、この構文は役に立ちません。そして、ほとんどの場合、ポインタ代入の ++ と -- は役に立ちません。右?

4

4 に答える 4

6

字句グループ化は無関係です。重要なのは のですp++

このステートメントは、次の 2 つのステートメントと同じです。

sum = sum * 10 - '0' + (*p = getchar());
++p;
于 2013-04-29T10:01:37.593 に答える
3
sum = (((sum * 10) - '0') + ((*(p++)) = (getchar())));

と同等です

*p = getchar();
sum = ( ((sum * 10) - '0') + *p );
p++;

1行に減りました。そのような方法でコードを書くと、コードのサイズと複雑さを減らすことができるため、役に立たないわけではありません

sum = (((sum * 10) - '0') + ((*(++p)) = (getchar())));

と同等です

p++;
*p = getchar();
sum = ( ((sum * 10) - '0') + *p );
于 2013-04-29T10:01:57.113 に答える