0
#include<stdio.h>
int main()
{
    char *s[] = { "knowledge","is","power"};
    char **p;
    p = s;
    printf("%s ", ++*p);
    printf("%s ", *p++);
    printf("%s ", ++*p);

    return 0;
}

出力:

nowledge nowledge s

printf()2番目のステートメントからの出力を特別に説明してください。同じ優先順位があるため、最初にin++をインクリメントしてから使用する必要があると思います(単項演算子の場合は右から左への結合性)。**p++ p*

4

4 に答える 4

5

最初のものは*pをインクリメントし、文字列を表示します(knowldegeではnに設定します)。2つ目は、文字列* pを表示してから、pをインクリメントします(「is」に移動します)。3番目は*pをインクリメントし、文字列を表示します(「is」のsから始まります)。

于 2012-06-22T19:42:25.167 に答える
3

C ++演算子の優先順位によると:

  1. 「*」は接頭辞「++」と同じ優先順位を持ちますが、左から右に評価する必要があります。

    printf( "%s"、++ * p);

したがって、最初*pに評価され、次に++(*p)、最初の文字列の2番目の文字につながります。

  1. 「*」は接尾辞「++」よりも優先順位が低くなります。

    printf( "%s"、* p ++);

したがって、最初pはインクリメントされますポストインクリメントです。操作から返される値はの値です。このように、は*、最初の文字列の2番目の文字を指す元のポインタに対して動作します。

今回は、以上ではなく、++以上で動作していることに注意してください。p*p

  1. 「2」以降p、2番目の文字列を指します。これを行う++*pと、2番目の文字列( "s")の2番目の文字を指していることになります。再びプリインクリメントを使用しているため、渡される値printfはすでに変更されています。

    printf( "%s"、++ * p);

少し変更を加えてポインタ値も出力すると、より明確になる可能性があります(警告は無視してください)。

printf("%s [%p]\n", ++*p, p );
printf("%s [%p]\n ", *p++, p );
printf("%s [%p]\n ", ++*p, p );

nowledge [0x7fff6f5519e0]
nowledge [0x7fff6f5519e8]
 s [0x7fff6f5519e8]
于 2012-06-22T19:54:54.093 に答える
2

インクリメント後置演算子(p++)が評価する値はpです。インクリメントプレフィックス演算子(++p)が評価する値はp+1です。

2番目のprintfで、*p++は何*pに評価されるかを評価しますが、増分するという副作用がありますp

于 2012-06-22T19:44:32.123 に答える
1

トリッキーな演算子のシーケンスに直面した場合、一連の単純なステートメントとして書き直すのは簡単なことがよくあります。あなたのブロックは次のようになります:

p[0]++;  //skips over the 'k' in knowledge
printf("%s", *p);
printf("%s", *p);
p++;     //moves to the next word
p[0]++;  //skips over the 'i' in is
printf("%s", *p);
于 2012-06-22T21:56:01.977 に答える