トップページ > プログラム > 2020年09月28日 > BXhKM0Xn0

書き込み順位&時間帯一覧

9 位/163 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000200200000000000004



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん (ワッチョイ f793-raSa)
C言語なら俺に聞け 155

書き込みレス一覧

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
ひらがなでわかりやすくせつめいしてくださったので
あたまのわるいわたしでもようやくわかりました
ありがとうございます


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。