!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C言語なら俺に聞け 155
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0981デフォルトの名無しさん (ワッチョイ f793-raSa)
2020/09/28(月) 07:30:53.01ID: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
キャスト演算子で型を指定すると、代入の際の暗黙的な変換が禁止される仕様とかあるんですか?
キャスト演算子で型を指定した0は、代入の際にint*型へ変換してくれない。
接尾語を付けて型を指定した0は、代入の際にint*型に変換してくれる。
int* p = (long int)0; // NG
int* p = 0L; // OK
int* p = (unsigned int)0; // NG
int* p = 0u; // OK
キャスト演算子で型を指定すると、代入の際の暗黙的な変換が禁止される仕様とかあるんですか?
982デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
2020/09/28(月) 07:54:15.67ID:QxfbhGyV0 >>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って警告でるけど型の話じゃないね
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って警告でるけど型の話じゃないね
983デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
2020/09/28(月) 08:00:54.96ID:QxfbhGyV0 >>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で間接段数の問題ではないので黙っているという説明がつく
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で間接段数の問題ではないので黙っているという説明がつく
984デフォルトの名無しさん (ワッチョイ 6b05-b+lb)
2020/09/28(月) 08:46:00.83ID:E0ldxkXM0 0だけは特別にポインタにキャスト可能な仕様なんじゃよ
0がいい 0になろう
0がいい 0になろう
985デフォルトの名無しさん (ワッチョイ 1ee9-b+lb)
2020/09/28(月) 08:46:40.00ID:IwymMB/J0 >>980
0 の型は int だけど、空ポインタ定数 "null pointer constant" なので、すべてのポインタ型への暗黙変換が効く。
http://kikakurui.com/x3/X3010-2003-01.html#39
> 値0をもつ整数定数式又はその定数式を型void *にキャストした式を,空ポインタ定数(null pointer constant)と呼ぶ。
(int)0 になると空ポインタ定数ではなくなるので、ポインタに暗黙変換できなくなり、初期化・代入できなくなる。
0 の型は int だけど、空ポインタ定数 "null pointer constant" なので、すべてのポインタ型への暗黙変換が効く。
http://kikakurui.com/x3/X3010-2003-01.html#39
> 値0をもつ整数定数式又はその定数式を型void *にキャストした式を,空ポインタ定数(null pointer constant)と呼ぶ。
(int)0 になると空ポインタ定数ではなくなるので、ポインタに暗黙変換できなくなり、初期化・代入できなくなる。
986デフォルトの名無しさん (ワッチョイ 4b2c-ozis)
2020/09/28(月) 09:14:55.72ID:QIpyCS2B0 >>981
int* p = (long int)0; // NG
int* p = (unsigned int)0; // NG
long, unsigned は、int 型と、数値の範囲が異なる。
int 型しかキャストできないのでは?
int* p = (long int)0; // NG
int* p = (unsigned int)0; // NG
long, unsigned は、int 型と、数値の範囲が異なる。
int 型しかキャストできないのでは?
987986 (ワッチョイ 4b2c-ozis)
2020/09/28(月) 09:19:20.10ID:QIpyCS2B0 0 アドレスの特別ルールか
988デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
2020/09/28(月) 09:26:33.33ID:QxfbhGyV0 0も厳格にはマジックナンバーだが
現実のシステムで0番地なんか普通の変数に使えなくていいから
理に適ってる
現実のシステムで0番地なんか普通の変数に使えなくていいから
理に適ってる
989デフォルトの名無しさん (ワッチョイ 1ee9-b+lb)
2020/09/28(月) 09:47:47.09ID:IwymMB/J0 アドレスは関係ないよ。
http://www.kouno.jp/home/c_faq/c5.html#5
http://www.kouno.jp/home/c_faq/c5.html#5
990デフォルトの名無しさん (ワッチョイ f793-raSa)
2020/09/28(月) 10:10:46.96ID: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」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
むつかしくてわからないのでひらがなでおねがいします
>>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」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
991デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
2020/09/28(月) 10:24:28.53ID:QxfbhGyV0 >>990
じーしーしーのばーじょんをかくにんしてから
おまえさんのこーどをくわせてみてるんだよ
せんげんだけしてつかってないへんすうがあるのをけいこくされているけど
それはおまえさんがきにしてるかたのもんだいじゃなさそうだねっていってるの
じーしーしーのばーじょんをかくにんしてから
おまえさんのこーどをくわせてみてるんだよ
せんげんだけしてつかってないへんすうがあるのをけいこくされているけど
それはおまえさんがきにしてるかたのもんだいじゃなさそうだねっていってるの
992デフォルトの名無しさん (ワッチョイ f793-raSa)
2020/09/28(月) 10:34:20.53ID:BXhKM0Xn0993デフォルトの名無しさん (エムゾネ FF32-0ian)
2020/09/28(月) 11:51:02.18ID:PXJ7xAyjF NULL == 0 // true
ちなみに0は
ちなみに0は
994デフォルトの名無しさん (エムゾネ FF32-0ian)
2020/09/28(月) 11:51:34.94ID:PXJ7xAyjF NULL == 0 // true
ちなみに0は8進数な
ちなみに0は8進数な
995デフォルトの名無しさん (ワントンキン MM42-S6Ic)
2020/09/28(月) 12:33:12.25ID:Iit1NWg4M NULL == 0 // true
ちなみに0は8進数なんてことなく10進数なんてことなく16進数なんてこともない
ちなみに0は8進数なんてことなく10進数なんてことなく16進数なんてこともない
996デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
2020/09/28(月) 13:16:35.37ID:QxfbhGyV0 いや8進数だよ
0xで始まったら16進数
0で始まったら8進数
こんな関数作って見たらわかるよ
syukudai("210") == 210
syukudai("110") == 110
syukudai("010") == 8
syukudai("0x10") == 16
0xで始まったら16進数
0で始まったら8進数
こんな関数作って見たらわかるよ
syukudai("210") == 210
syukudai("110") == 110
syukudai("010") == 8
syukudai("0x10") == 16
997デフォルトの名無しさん (ワッチョイ 92a5-6ZJT)
2020/09/28(月) 13:27:42.04ID:zovFJ8Ky0 次スレは
998デフォルトの名無しさん (ブーイモ MM0e-Nkam)
2020/09/28(月) 14:23:39.09ID:qeCUoC3kM みんなの心の中にいつまでもいるさ
999デフォルトの名無しさん (ワッチョイ 6b4e-gvfU)
2020/09/28(月) 14:46:36.10ID:MwxSOqxv0 質問いいですか?
1000デフォルトの名無しさん (ワントンキン MM42-S6Ic)
2020/09/28(月) 14:57:57.86ID:Iit1NWg4M10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 140日 15時間 37分 31秒
新しいスレッドを立ててください。
life time: 140日 15時間 37分 31秒
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 今年の漢字 [ぐれ★]
- 【おこめ券】物価高対策の“おこめ券”全米販は1枚477円で販売へ 鈴木農水大臣「国民の皆様に活用いただきやすいよう工夫いただいた」★2 [ぐれ★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ★3 [冬月記者★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★5 [蚤の市★]
- 今年の漢字は「熊」に決定! 相次ぐクマ被害 去年は「金」 [冬月記者★]
- 【老舗文具メーカー】「生成AIで制作していた」――サクラクレパス、“AI疑惑”ポスターの調査結果を報告 ★2 [ぐれ★]
- 虫歯の味ってわかるよね
- 参政党議員「クジラの肉を食べないのは流通や販路に問題があるからだよね?」 [592058334]
- __トランプ、G7に代わる「Core 5」構想、米 中 露 印 日をまとめる巨大枠組み、世界秩序の再編につながる可能性 [827565401]
- 熊って鍛えたらどうなんの?
- めちゃくちゃ美人の派遣社員が入ってきたんやが
- VTuber叩きが大流行してる理由、1枚の画像で解説される…!! [858219337]
