2016-04-01 8 views
-6

あなたはint型のポインタ変数があるとのprintfに変更するようですprintfで同じことをする優先順位は<code>++</code>が右</p> <p>が優先されていたので、</p> <p><code>int* q = malloc(sizeof(int))</code>は今、いくつかの他のメモリ位置を指します。この</p> <pre><code>*q++; </code></pre> <p><code>q</code>をやって、

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との比較接頭辞は*微妙ではありません。それは後置記表記の全体的なポイントです... – DevSolar

答えて

0

++が変数の後にある場合、命令の評価後にインクリメントが行われます。printf("%d",*q++);printf("%d",*q), ++q;のようになります。

従ってprintfは「良い」番号を出力し、その後ポインタは無効になりますが、優先順位は変更されません。どちらの場合も同じですが、最初のケースでは逆参照は何もしません。

3

++は後置インクリメントです。これは単項よりも優先度が高い。*

結果の値の計算は、オペランドの格納された値を更新する側 効果の前に配列決定される:ただし、変数を更新する副作用は、変数評価(6.5.2.4)の後に行われます。

したがって*q++は常に、あなたにそれがあなたのコード内で使用されているに関係なく*qの値が得られます。

これは、接頭辞と接頭辞のインクリメントの違いです。 *++qはポインタを最初にインクリメントしてから新しいアドレスの値を評価します。

1

増分のために定義された演算子は2つあります。それらは前と後の両方でインクリメントされています。 最初ずつ前置インクリメント演算子

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

とポストインクリメント演算子は値をインクリメントその後を返す新しい値を返します:それはあなたが関数を呼び出したかのようです。

OKこれは説明のためのものです。技術的には、戻ってからインクリメントすることはできません。そのため、初期値を記憶してから、記憶した値を増分して返します。これは、コンパイラが差を最適化しない限り、プリインクリメントがポストインクリメントよりも効率的である理由です...

+0

C言語の関数呼び出しにはシーケンスポイントが含まれているので、関数を類推として使うのは良い考えではありません。関数が呼び出される前に、すべての副作用が評価されたことを意味します。また、プリインクリメントは効率的ではありません。それは1980年代の古い神話です。 (C++を書かない限り)[これを見てください](http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i--i-in-c/26482954#26482954) 。 – Lundin

+0

私は、なぜ* q ++の結果が結果になるのかを尋ねると、関数の類推が理解のためにはうまく機能するレベルにありますが、シーケンスポイントは後で対処するはるかに高度なトピックです。そして実際に質問にはC++のタグが付いています... – Aconcagua

関連する問題