2017-05-09 8 views
0

は、3行目の評価順序は何ですか? (私はこのPの後に奇妙な何かを指すかもしれないことを知っている - しかし、両方*と++は、同じ優先順位を持っているようだと、私は、正しいメモリのアドレッシングが、評価のために興味がない)(と表現のための*と++)Cでの評価の順序

+0

いいえ、同じ優先順位はありません。 Postfix形式++は、接頭辞形式とは異なり、*よりも優先度が高くなります。 – StoryTeller

+0

'++'がポインタをインクリメントすることを覚えておく簡単な方法は、通常のシングルラインstrcpyの実装に注意することです。 'while(* dst ++ = * srC++);' ++はポインタの代わりに実際の文字をインクリメントする。 – Groo

+3

オペレータの優先順位は[検出可能なもの](http://en.cppreference.com/w/c/language/operator_precedence)です。 –

答えて

4

いいえ、postfix increment has higher precedence

場合によっては、値の評価(参照解除演算子付き)の後で増分の副作用が発生します。ただし、評価の結果は破棄されます(結果を保存するための努力はしていません)。

C11を引用、章§6.5.2.4、(強調鉱山

だから、最終的には、結果が同等


p++;として注意されます

接尾辞の結果++演算子は、オペランドの値です。副作用として、オペランドオブジェクトの の値がインクリメントされます(つまり、適切な型の値1が に追加されます)。加算器演算子と、制約、型、および変換に関する の情報と複合ポインタの説明、および ポインタの操作の影響を参照してください。 結果の値の計算は、オペランドの格納された値を更新する副作用( )の前に順序付けされます。 [...]

あなたはこれが動作するために* Pの周囲かっこを配置する必要があり
+0

したがって、++(より高い優先順位を持つ)を最初に評価する必要があるとしても、* pが評価されるまで延期されますか? – Alex

+0

@Alexはい、「増分」は副作用です。後者の値「++」はオペランド自体の値で、すでに私の答えで強調表示されています。 –

+0

@Alex - 確かに評価の順序と優先順位は本質的に無関係です。 http://stackoverflow.com/a/5475260/129570を参照してください。 –

-2

int i = 5; /*line 1*/ 
int *p = &i; /*line 2*/ 
(*p)++; /*line 3*/ 
printf("Hello, World! %d\n", *p); 

参照:http://en.cppreference.com/w/c/language/operator_precedence

+3

*何のために*働いていますか?営業担当者は、彼が望んでいたことを特定せず、これらの3つのラインがどのように評価されるかを尋ねただけでした。 – StoryTeller

+0

あなたはそうです。実際には、オペレータはコンパイルして、演算子の優先順位についていくつかのバリエーションを実行し、それらがどのように期待に合っているかを見てください。ああ、まあ、SOはポイントを獲得するのは簡単なゲームじゃない! :-) – EricWerk

0

*p++*(p++)として扱われるので、後置++の優先順位は、であり、*である。

+0

これは本当ですか? –

+0

@SouravGhoshはい – rsp

+1

@SouravGhosh - 意味的には正しい評価です。コンパイラはインクリメントの前にロードを順序付けるでしょうが、標準の '* p ++ 'で定義されているC抽象化は、** rsp **と同様に' *(p ++) 'と意味的に等価です。 – StoryTeller

関連する問題