20/09/28 07:54:15.67 QxfbhGyV0.net
>>980
intだよ
D:\learn>gcc --version
gcc (Rev2, Built by MSYS2 project) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
D:\learn>gcc 980.c
D:\learn>gcc 980.c -pedantic -Wall
980.c: In function 'main':
980.c:9:10: warning: unused variable 'p3' [-Wunused-variable]
9 | int* p3 = (unsigned int)0; //
| ^~
980.c:8:10: warning: unused variable 'p2' [-Wunused-variable]
8 | int* p2 = (int)0; // ntintnt*nt
| ^~
980.c:7:10: warning: unused variable 'p1' [-Wunused-variable]
7 | int* p1 = 0; // K
| ^~
-Wallにするとunusedって警告でるけど型の話じゃないね
994:デフォルトの名無しさん
20/09/28 08:00:54.96 QxfbhGyV0.net
>>981
D:\learn>cl 980.c /W4
Microsoft(R) C/C++ Optimizing Compiler Version 19.27.29111 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
980.c
980.c(8): warning C4047: '初期化中': 間接参照のレベルが 'int *' と 'int' で異なっています。
980.c(9): warning C4189: 'p3': ローカル変数が初期化されましたが、参照されていません
980.c(7): warning C4189: 'p1': ローカル変数が初期化されましたが、参照されていません
980.c(8): warning C4189: 'p2': ローカル変数が初期化されましたが、参照されていません
Microsoft (R) Incremental Linker Version 14.27.29111.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:980.exe
980.obj
参照されていませんという警告は型の話ではないのでここではスルー
型についての警告が出ている8行目とやらはこれ
> int* p2 = (int)0; // 明示的にint型にしてから渡すと「int型はint*型に変換できません」とエラー。ということは、この 0 はint型以外?
隣の9行目は警告されていない(しかも/W4で)
> int* p3 = (unsigned int)0; // これもエラーで無理。
おそらくclが警告しているのはXXX*とXXXでポインタの間接段数を間違えたんだろうということ
これなら9行目はXXX*とYYYで間接段数の問題ではないので黙っているという説明がつく
995:デフォルトの名無しさん
20/09/28 08:46:00.83 E0ldxkXM0.net
0だけは特別にポインタにキャスト可能な仕様なんじゃよ
0がいい 0になろう
996:デフォルトの名無しさん
20/09/28 08:46:40.00 IwymMB/J0.net
>>980
0 の型は int だけど、空ポインタ定数 "null pointer constant" なので、すべてのポインタ型への暗黙変換が効く。
URLリンク(kikakurui.com)
> 値0をもつ整数定数式又はその定数式を型void *にキャストした式を,空ポインタ定数(null pointer constant)と呼ぶ。
(int)0 になると空ポインタ定数ではなくなるので、ポインタに暗黙変換できなくなり、初期化・代入できなくなる。
997:デフォルトの名無しさん
20/09/28 09:14:55.72 QIpyCS2B0.net
>>981
int* p = (long int)0; // NG
int* p = (unsigned int)0; // NG
long, unsigned は、int 型と、数値の範囲が異なる。
int 型しかキャストできないのでは?
998:986
20/09/28 09:19:20.10 QIpyCS2B0.net
0 アドレスの特別ルールか
999:デフォルトの名無しさん
20/09/28 09:26:33.33 QxfbhGyV0.net
0も厳格にはマジックナンバーだが
現実のシステムで0番地なんか普通の変数に使えなくていいから
理に適ってる
1000:デフォルトの名無しさん
20/09/28 09:47:47.09 IwymMB/J0.net
アドレスは関係ないよ。
URLリンク(www.kouno.jp)
1001:デフォルトの名無しさん
20/09/28 10:10:46.96 BXhKM0Xn0.net
>>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」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
1002:デフォルトの名無しさん
20/09/28 10:24:28.53 QxfbhGyV0.net
>>990
じーしーしーのばーじょんをかくにんしてから
おまえさんのこーどをくわせてみてるんだよ
せんげんだけしてつかってないへんすうがあるのをけいこくされているけど
それはおまえさんがきにしてるかたのもんだいじゃなさそうだねっていってるの
1003:デフォルトの名無しさん
20/09/28 10:34:20.53 BXhKM0Xn0.net
>>991
ひらがなでわかりやすくせつめいしてくださったので
あたまのわるいわたしでもようやくわかりました
ありがとうございます
1004:デフォルトの名無しさん
20/09/28 11:51:02.18 PXJ7xAyjF.net
NULL == 0 // true
ちなみに0は
1005:デフォルトの名無しさん
20/09/28 11:51:34.94 PXJ7xAyjF.net
NULL == 0 // true
ちなみに0は8進数な
1006:デフォルトの名無しさん
20/09/28 12:33:12.25 Iit1NWg4M.net
NULL == 0 // true
ちなみに0は8進数なんてことなく10進数なんてことなく16進数なんてこともない
1007:デフォルトの名無しさん
20/09/28 13:16:35.37 QxfbhGyV0.net
いや8進数だよ
0xで始まったら16進数
0で始まったら8進数
こんな関数作って見たらわかるよ
syukudai("210") == 210
syukudai("110") == 110
syukudai("010") == 8
syukudai("0x10") == 16
1008:デフォルトの名無しさん
20/09/28 13:27:42.04 zovFJ8Ky0.net
次スレは
1009:デフォルトの名無しさん
20/09/28 14:23:39.09 qeCUoC3kM.net
みんなの心の中にいつまでもいるさ
1010:デフォルトの名無しさん
20/09/28 14:46:36.10 MwxSOqxv0.net
質問いいですか?
1011:デフォルトの名無しさん
20/09/28 14:57:57.86 Iit1NWg4M.net
>>996
> 0で始まったら8進数
なら、敢えて数字リテラルで8進数のゼロを表すなら 00 だろう。
つか8未満の数「値」に8進数ってなんだYO!!
1012:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 140日 15時間 37分 31秒
1013:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています