- C言語なら俺に聞け 155
980 :デフォルトの名無しさん (ワッチョイ f793-raSa)[]:2020/09/28(月) 07:00:27.18 ID:BXhKM0Xn0 - 数値リテラル「0」の型は何ですか?
int* p = 0; // これはOK int* p = (int)0; // 明示的にint型にしてから渡すと「int型はint*型に変換できません」とエラー。ということは、この 0 はint型以外? int* p = (unsigned int)0; // これもエラーで無理。 printf("%zu", sizeof(0)); // 0の型のサイズを調べると4byteと表示される。 この数値リテラルの「0」の型は何ですか? ちなみに、まだC言語環境を構築してないから、代わりVisualC++を使ってるけど、他の環境でも起きますか?
|
- C言語なら俺に聞け 155
981 :デフォルトの名無しさん (ワッチョイ f793-raSa)[]:2020/09/28(月) 07:30:53.01 ID:BXhKM0Xn0 - さらに調べると・・・・
キャスト演算子で型を指定した0は、代入の際にint*型へ変換してくれない。 接尾語を付けて型を指定した0は、代入の際にint*型に変換してくれる。 int* p = (long int)0; // NG int* p = 0L; // OK int* p = (unsigned int)0; // NG int* p = 0u; // OK キャスト演算子で型を指定すると、代入の際の暗黙的な変換が禁止される仕様とかあるんですか?
|
- C言語なら俺に聞け 155
990 :デフォルトの名無しさん (ワッチョイ f793-raSa)[]:2020/09/28(月) 10:10:46.96 ID:BXhKM0Xn0 - >>982
むつかしくてわからないのでひらがなでおねがいします >>985 こんな感じで理解しておけばいいですか? ・整数定数式としての「0」とは、ソースコードに直接書かれた「0」で、評価されて返ってきた「(int)0 ⇒ 0」や「4 - 4 ⇒ 0」などの「0」は整数定数式とは言わない。 ・同じ0でも、void*型の「0」や、整数定数式としての「0」だけを空ポインタ定数と呼び、空ポインタ定数は代入の際にポインタ型へ暗黙変換できる。 よって int* p = (int)0; // 「(int)0」が評価されて返ってきた「0」は整数定数式ではないので空ポインタ定数ではない。だから暗黙変換できずに代入無理。 int* p = 4-4; // 同様に、評価されて返ってきた「0」は整数定数式ではないので空ポインタ定数ではない。だから暗黙変換できずに代入無理。 int* p = 0; // 定数式としての「0」だから代入OK 型と値が一緒の、同じint型の「0」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
|
- C言語なら俺に聞け 155
992 :デフォルトの名無しさん (ワッチョイ f793-raSa)[]:2020/09/28(月) 10:34:20.53 ID:BXhKM0Xn0 - >>991
ひらがなでわかりやすくせつめいしてくださったので あたまのわるいわたしでもようやくわかりました ありがとうございます
|