質問: (result & (mask< 3&10 ---> 2(hex) / 2(dec) 00000011 &)00001010 --------- 00000010 > 3|10 ---> B(hex) / 11(dec) 00000011 |)00001010 --------- 00001011 > 3^10 ---> 9(hex) / 9(dec) 00000011 ^)00001010 --------- 00001001 > ~3 ---> FC(hex) / 252(dec) ~)00000011 --------- 11111100 > q $ ``` 2016/08/06 追記 もう一つ、質問がありました。 if-else文が終わってから、 ``` strcpy(p,"\n\t%c)"); //疑問点 ``` この文で%cとあり、今回のプログラムでは、& | ^ ~ のどれかが表示されるのですが、 例えば、 ``` int a=10; printf("%d",a); ``` のように、変換指定と、それに対する引数が必要だと思うのですが、上の疑問点には、引数が無いのになぜ、表示されるのでしょうか。 --- 以上は分かりましたが、新たに疑問がありますので、ご回答よろしくお願いします。 2018/02/06 追記 新たな疑問が出たので、ご回答ください。 ``` result &=(save==8)? 0x00ff:0xffff; ``` この文は無くても動きましたが、どのような意味があるのでしょうか。 8ビットの場合と16ビットの場合で、ANDマスクしていますが、意味が分かりません。 resultはすでに先の演算で値ができているのに、それをあえてAND演算するのか、疑問です。
回答: ``` strcpy(p, や *p++= ``` > > この操作をする度にpの値が変わるのではないかと思います。 > > > pはポインタであり、ポインタpがこのプログラムで司っているのは line配列上の位置です。 初期化時に lineの先頭(`line[0]`)にセットされ、その後の操作(pに対する変更)でline上のどこを見ているかが変わります。 内容として変更されているのはlineになります。 pに対する変更(for文で行なわれている)はline上のどこを *pでみたいかの場所移動になります。 *p に対する変更は、 line上の実際の値の変更になります。 変更は全てlineに対して行われているので、最後にlineを出力すれば問題ありません。 > > この %i というのは %d と同じと解釈して良いのでしょうか。 > > > だいたい同じですが、 '0x??'とか '0??' を指定した場合に%iは16進数や8進数として受け付けます。 追記 scanfの %i についてサンプルを書いておきます。 scanfで %i が 入力をどう整数かするかの参考にしてください。 scan_sample.c ``` #include #include int main(){ int a; scanf("%d", &a); printf(" %%d -> %d (%%d)\n", a); printf(" %%d -> %i (%%i)\n", a); scanf("%i", &a); printf(" %%i -> %d (%%d)\n", a); printf(" %%i -> %i (%%i)\n", a); int b,c; char str[] = "012.012.0x12."; sscanf(str, "%d.%i.%i.", &a, &b, &c); printf("\n"); printf("%s -> a(%%d).b(%%i).c(%%i)\n", str); printf(" a = %d\n", a); printf(" b = %d\n", b); printf(" c = %d\n", c); char str2[] = "99.99.099."; sscanf(str2, "%d.%i.%i.", &a, &b, &c); printf("\n"); printf("%s -> a(%%d).b(%%i).c(%%i)\n", str2); printf(" a = %d\n", a); printf(" b = %d\n", b); printf(" c = %d\n", c); return 0; } ``` 結果。 コメントに書いた通りprintf では `%d`も`%i` も差はありません。 2回目の入力で099など 8進数でありえないものを入力した場合は0になります。99は10進として判断されるので問題ありません。 ``` $ gcc scan_sample.c && ./a.out 077 %d -> 77 (%d) # 077 を %d で受け付け、 %dで出力。77と解釈されている %d -> 77 (%i) 077 %i -> 63 (%d) # 077 を %i で受け付け、 %dで出力。63 (8進数で077)と解釈されている %i -> 63 (%i) 012.012.0x12. -> a(%d).b(%i).c(%i) # 左の文字列を、右の「変数(書式文字)」ので受け付けた場合 a = 12 # 012 10進 b = 10 # 012 8進 c = 18 # 0x12 16進 99.99.099. -> a(%d).b(%i).c(%i) a = 99 b = 99 # 接頭辞 0 や 0x がなければ 10進数として値を取得して変数に入っている。 c = 0 # 099 は先頭が0なので8進と判断されたが099は8進として不正なので ```