1

次の C コードの出力を理解できません。

#include<stdio.h>
main()
{
   char * something = "something";
   printf("%c", *something++);  // s
   printf("%c", *something);    // o
   printf("%c", *++something);  // m
   printf("%c", *something++);  // m
}

助けてください :)

4

4 に答える 4

6

詳細については、 http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedenceを参照してください

printf("%c", *something++);

*something の文字を取得し、それをインクリメントします ('s')

printf("%c", *something);

文字を取得するだけです(最後のステートメント( 'o')のインクリメントにより、2番目になりました)

printf("%c", *++something);

インクリメントしてから、新しい位置の文字を取得します ( 'm' )

printf("%c", *something++);

*something の文字を取得し、それをインクリメントします ('m')

于 2012-11-12T05:24:36.757 に答える
6

とてもシンプルです。

char * something = "something";

ポインターの割り当て。

printf("%c\n", *something++);//equivalent to *(something++)

ポインターはインクリメントされますが、インクリメント前の値は逆参照され、インクリメント後の値になります。

printf("%c\n", *something);//equivalent to *(something)

前のステートメントのインクリメントの後、ポインタは現在「o」を指しています。

printf("%c\n", *++something);//equivalent to *(++something)

ポインターは「m」を指すようにインクリメントされ、ポインターをインクリメントした後に参照解除されます。これはプリインクリメントであるためです。

printf("%c\n", *something++);//equivalent to *(something++)

最初の回答と同じです。'\n'また、printf のすべての文字列の末尾にも注意してください。出力バッファをフラッシュし、行を印刷します。\nprintf の最後には常に a を使用してください。

この質問も参照してください。

于 2012-11-12T05:24:38.943 に答える
4
// main entrypoint
int main(int argc, char *argv[])
{
    char * something = "something";

    // increment the value of something one type-width (char), then
    //  return the previous value it pointed to, to be used as the 
    //  input for printf.
    // result: print 's', something now points to 'o'.
    printf("%c", *something++);

    // print the characer at the address contained in pointer something
    // result: print 'o'
    printf("%c", *something);

    // increment the address value in pointer something by one type-width
    //  the type is char, so increase the address value by one byte. then
    //  print the character at the resulting address in pointer something.
    // result: something now points at 'm', print 'm'
    printf("%c", *++something);

    // increment the value of something one type-width (char), then
    //  return the previous value it pointed to, to be used as the 
    //  input for printf.
    // result: print 's', something now points to 'o'.
    printf("%c", *something++);
}

結果:

somm
于 2012-11-12T05:28:45.720 に答える
0

常に時計回りのルールを使用する時計回りのルール

printf("%c\n", *something++);

ルールに従って、最初に遭遇する*なので、値を取得してから++はインクリメントを意味します

ここに画像の説明を入力してください

3番目のケースでは printf("%c\n", *something++);

ここに画像の説明を入力してください

したがって、画像に応じて値++をインクリメントし、値を取得します*

于 2012-11-12T05:33:07.693 に答える