次の C コードの出力を理解できません。
#include<stdio.h>
main()
{
char * something = "something";
printf("%c", *something++); // s
printf("%c", *something); // o
printf("%c", *++something); // m
printf("%c", *something++); // m
}
助けてください :)
詳細については、 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')
とてもシンプルです。
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 のすべての文字列の末尾にも注意してください。出力バッファをフラッシュし、行を印刷します。\n
printf の最後には常に a を使用してください。
この質問も参照してください。
// 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
常に時計回りのルールを使用する時計回りのルール
printf("%c\n", *something++);
ルールに従って、最初に遭遇する*なので、値を取得してから++はインクリメントを意味します
3番目のケースでは printf("%c\n", *something++);
したがって、画像に応じて値++をインクリメントし、値を取得します*