回答編集履歴
3
誤字の修正
answer
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
`%p`でも`%d`でもなんでも同じです。
|
20
20
|
printfはvoid*の解釈を文字列から推測するだけです。
|
21
21
|
|
22
|
-
`%p
|
22
|
+
`%p`の値が同じものを2つ渡せば、当然同じ値になります。
|
23
23
|
|
24
24
|
#配列test[]のtestと&testを渡した結果が同じ理由
|
25
25
|
|
2
変な言い回しの修正
answer
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
printfの文字列の右側の要素にたいした型チェックがないからです。
|
4
4
|
printfは一番左側で渡された文字列を解析し、右側の引数が何かを判別し動作する関数です。
|
5
|
-
渡された値で決定するのではなく、文字列内
|
5
|
+
渡された値で決定するのではなく、文字列内の`%`から続くパラメータを見て初めて変数の存在を判別します。
|
6
6
|
|
7
|
-
この値が正しい場所を指していればint型で渡そうが文字列を渡すこと
|
7
|
+
この値が正しい場所を指していればint型で渡そうが例えば文字列を渡すことはできます。
|
8
8
|
|
9
9
|
```C
|
10
10
|
char *str = "test";
|
11
11
|
unsigned long value = (unsigned long)str;
|
12
12
|
|
13
|
-
printf("%s\n", value);
|
13
|
+
printf("%s\n", value); // unsingned longだが"test"が表示される
|
14
14
|
printf("%p\n", str);
|
15
15
|
printf("%p\n", value);
|
16
16
|
```
|
1
追記
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#コンパイルが通る理由
|
2
2
|
|
3
|
-
printfの右側の要素にたいした型チェックがないからです。
|
3
|
+
printfの文字列の右側の要素にたいした型チェックがないからです。
|
4
4
|
printfは一番左側で渡された文字列を解析し、右側の引数が何かを判別し動作する関数です。
|
5
5
|
渡された値で決定するのではなく、文字列内で`%s`が指定されて初めて文字列と判定します。
|
6
6
|
|