!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:Z3WQBr9X0928デフォルトの名無しさん (ラクッペペ MM8f-kMIc)
2020/09/17(木) 21:54:03.82ID:PVWtVfHXM そう、仮引数の配列要素数はコンパイラに無視される
ただのポインタだから配列サイズは失われている
ただのポインタだから配列サイズは失われている
929デフォルトの名無しさん (アウアウエー Sadf-XGHE)
2020/09/17(木) 22:14:39.96ID:ysRkZn2Ya >>926
うっかり変更しようとしたら、コンパイル時にエラーになるでしょ
うっかり変更しようとしたら、コンパイル時にエラーになるでしょ
930デフォルトの名無しさん (ワッチョイ 177f-mv5V)
2020/09/17(木) 22:35:38.61ID:qRMpu/GI0931はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 22:46:13.06ID:FojOL81h0 修飾なしで const になって、変更可能な変数の場合に指定を付けるようになってればよかったのに
という声は一部では根強く有る。
もちろんそんな非互換な変更を C/C++ が受け入れるはずがないので
あくまでももしもの話というか愚痴の類なんだけど。
でも Rust がまさにそうなったので型の厳しさを指向するなら
デフォルトで変更不能な方が自然なのかもしれんね。
個人的には、 C で意識して const を付けるのは関数の仮引数くらいで十分だろう
という程度かな。 そのかわり仮引数の型付けはかなりしっかりしたい。
という声は一部では根強く有る。
もちろんそんな非互換な変更を C/C++ が受け入れるはずがないので
あくまでももしもの話というか愚痴の類なんだけど。
でも Rust がまさにそうなったので型の厳しさを指向するなら
デフォルトで変更不能な方が自然なのかもしれんね。
個人的には、 C で意識して const を付けるのは関数の仮引数くらいで十分だろう
という程度かな。 そのかわり仮引数の型付けはかなりしっかりしたい。
932デフォルトの名無しさん (ワッチョイ 17da-o3gE)
2020/09/17(木) 23:08:14.29ID:VrEKPYEi0933デフォルトの名無しさん (ワッチョイ ff63-LEsg)
2020/09/17(木) 23:13:21.69ID:aQ5w/H9b0 リソースが極限まで制限されるような環境下で動かすことがる
ハードに近い部分を書くことが多かった
最適化の精度が悪かった
みたいな時代背景があるのでデフォルトがconstはナンセンス
もちろん今の時代に1から設計するならそういう言語が出てくるのは当然
ハードに近い部分を書くことが多かった
最適化の精度が悪かった
みたいな時代背景があるのでデフォルトがconstはナンセンス
もちろん今の時代に1から設計するならそういう言語が出てくるのは当然
934デフォルトの名無しさん (ワッチョイ 177f-PS54)
2020/09/17(木) 23:27:44.50ID:qRMpu/GI0 >>932
sizeof(*array)だよ
sizeof(*array)だよ
935デフォルトの名無しさん (ラクッペペ MM8f-Y+8D)
2020/09/17(木) 23:46:44.97ID:cQbuW7S9M936はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/18(金) 00:25:49.56ID:InePzAsW0 普通に array[1][3] みたいにして要素にアクセスするときでも
規格上の理屈では *(*(array+1)+3) の構文糖であるということになってて、
じゃあこれを成り立たせるにはどういう型情報があればいいのか
みたいな方向でパズル的に考えて遊んだりするのも面白いかもね。
あとここまでのやりとりで出てきてないっぽいから注意点を示しておくけど、
配列が暗黙の型変換でそれの先頭を指すポインタになるルールの例外が
sizeof を適用したときと単項 & を適用したときだよ。
規格上の理屈では *(*(array+1)+3) の構文糖であるということになってて、
じゃあこれを成り立たせるにはどういう型情報があればいいのか
みたいな方向でパズル的に考えて遊んだりするのも面白いかもね。
あとここまでのやりとりで出てきてないっぽいから注意点を示しておくけど、
配列が暗黙の型変換でそれの先頭を指すポインタになるルールの例外が
sizeof を適用したときと単項 & を適用したときだよ。
937デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/18(金) 06:03:42.05ID:dDojkzke0 sizeofと&が例外って言い方よく見かけるけど
気持ちの中ではこっちが本来だね
extern int array[]; と
extern int *array; じゃ
意味違うし
気持ちの中ではこっちが本来だね
extern int array[]; と
extern int *array; じゃ
意味違うし
938デフォルトの名無しさん (ワッチョイ 9f01-RDjc)
2020/09/18(金) 06:28:13.21ID:n6muJc1p0 >>933
> リソースが極限まで制限されるような環境下で動かすことがる
> ハードに近い部分を書くことが多かった
> 最適化の精度が悪かった
なんの理由にもなってないと思うが…
単にK&Rがそう言うのに無頓着だっただけだろ
> リソースが極限まで制限されるような環境下で動かすことがる
> ハードに近い部分を書くことが多かった
> 最適化の精度が悪かった
なんの理由にもなってないと思うが…
単にK&Rがそう言うのに無頓着だっただけだろ
939デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/18(金) 06:31:46.59ID:dDojkzke0 何の理由にもなってないのはそのとおりだが
なんで無頓着って話になるんだ?
アセンブラで書いていたUnicsを高級言語で書けるようにしようって作ったんだぜ?
なんで無頓着って話になるんだ?
アセンブラで書いていたUnicsを高級言語で書けるようにしようって作ったんだぜ?
940はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/18(金) 09:01:10.98ID:InePzAsW0941デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/18(金) 09:11:41.22ID:dDojkzke0 初心者がややこしい規則をこれから憶えようってときには
確かにあの言い方は情報量少なくて憶えやすそうだけど
初心者を卒業したらいつまでもしがみついてると格好悪いね
確かにあの言い方は情報量少なくて憶えやすそうだけど
初心者を卒業したらいつまでもしがみついてると格好悪いね
942デフォルトの名無しさん (ワッチョイ 9f01-RDjc)
2020/09/18(金) 10:09:00.07ID:n6muJc1p0943デフォルトの名無しさん (エムゾネ FFbf-SP/v)
2020/09/18(金) 10:37:02.65ID:6n8VMUNiF ラクッペペ MM8f-kMIc
↑
こいつは無視でOK
↑
こいつは無視でOK
944デフォルトの名無しさん (ワントンキン MM7f-zg3h)
2020/09/18(金) 12:10:56.45ID:3NbVdp1XM そんな感じの2次元配列の引数としてはかけるけど
実際その関数になに代入してもエラー吐くやつとかあったな
実際その関数になに代入してもエラー吐くやつとかあったな
945デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/18(金) 12:52:30.78ID:dDojkzke0 関数に代入ってどゆこと?
946デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/18(金) 12:54:19.87ID:dDojkzke0947デフォルトの名無しさん (ワントンキン MM7f-zg3h)
2020/09/18(金) 16:08:04.83ID:3NbVdp1XM >>945
引数になにいれてもだった
引数になにいれてもだった
948デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/18(金) 20:15:43.21ID:dDojkzke0 こういうこと?
void func(int (*array)[5], int **pointer)
{
char a[2][5], *p;
array = a; //ok
pointer = a; //error
array = &p; //error
pointer = &p; //ok
}
void func(int (*array)[5], int **pointer)
{
char a[2][5], *p;
array = a; //ok
pointer = a; //error
array = &p; //error
pointer = &p; //ok
}
949はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/18(金) 23:38:09.01ID:InePzAsW0950948 (ワッチョイ b7b7-Cup9)
2020/09/19(土) 09:21:06.58ID:FHaFE8730 あ、すまんw
s/char/int/g
s/char/int/g
951デフォルトの名無しさん (ワッチョイ 7f28-5uLG)
2020/09/19(土) 11:02:59.46ID:Uw1s41Nc0952はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/19(土) 13:13:28.09ID:cxOsPIuF0 >>951
一応は >>949 も未定義だよ。
呼出規約が cdecl だったら余計な引数は捨てられるだけで問題にならないとは思うけど。
余計な引数を渡すのとは逆に必要な引数を渡さないという例も書けるから、
より危険性がわかりやすいかな。
https://wandbox.org/permlink/1F876xK6UZ4wFjAA
余談だけど関数定義は宣言も兼ねるというルールにおいて、
K&R スタイルの関数定義はプロトタイプを持たない宣言でもあるという扱いだから
別途プロトタイプ宣言をする分にはエラーとして検出される。
https://wandbox.org/permlink/4n574f4R9yq0BzUj
一応は >>949 も未定義だよ。
呼出規約が cdecl だったら余計な引数は捨てられるだけで問題にならないとは思うけど。
余計な引数を渡すのとは逆に必要な引数を渡さないという例も書けるから、
より危険性がわかりやすいかな。
https://wandbox.org/permlink/1F876xK6UZ4wFjAA
余談だけど関数定義は宣言も兼ねるというルールにおいて、
K&R スタイルの関数定義はプロトタイプを持たない宣言でもあるという扱いだから
別途プロトタイプ宣言をする分にはエラーとして検出される。
https://wandbox.org/permlink/4n574f4R9yq0BzUj
953デフォルトの名無しさん (ワッチョイ 7f28-5uLG)
2020/09/19(土) 14:57:40.15ID:Uw1s41Nc0954デフォルトの名無しさん (ワッチョイ 7f28-5uLG)
2020/09/19(土) 14:57:50.91ID:Uw1s41Nc0 すまんsage
955デフォルトの名無しさん (ワッチョイ 9f26-XaKm)
2020/09/21(月) 03:21:46.70ID:SqQ7e3H60 >>952
普通先行宣言をちゃんとするだろ
普通先行宣言をちゃんとするだろ
956はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/21(月) 08:57:54.77ID:sulqQktu0 >>955
普通はする。 すべきだ。 というのがどれほどあてになるか。
普通はすることを (うっかり) しなかったら (エラーとして検出されずに) 通ってしまうってのは
K&R スタイルの関数定義はイケてないねって話。
普通はする。 すべきだ。 というのがどれほどあてになるか。
普通はすることを (うっかり) しなかったら (エラーとして検出されずに) 通ってしまうってのは
K&R スタイルの関数定義はイケてないねって話。
957はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/21(月) 08:59:37.43ID:sulqQktu0 K&R スタイルでなくともファイルを分割すると宣言と定義の矛盾が検出されなかったりもする。
// foo.c
void foo(int x) {
}
// foo.h
void foo(void);
// main.c
#include "foo.h"
int main(void) {
foo();
}
このとき foo.c をコンパイルするだけなら foo.h は不要だが
foo.c で foo.h をインクルードしておかないと間違いは検出できない。
// foo.c
void foo(int x) {
}
// foo.h
void foo(void);
// main.c
#include "foo.h"
int main(void) {
foo();
}
このとき foo.c をコンパイルするだけなら foo.h は不要だが
foo.c で foo.h をインクルードしておかないと間違いは検出できない。
958デフォルトの名無しさん (アウウィフ FF5b-SP/v)
2020/09/21(月) 10:49:53.26ID:M8W5JifWF linkエラーは?
959デフォルトの名無しさん (ワッチョイ 9f01-RDjc)
2020/09/21(月) 11:10:21.40ID:WONfy98d0960デフォルトの名無しさん (アウウィフ FF5b-SP/v)
2020/09/21(月) 11:19:45.80ID:M8W5JifWF 実行時にスタック壊れたり
hangupしたりするんです?
hangupしたりするんです?
961はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/21(月) 12:59:37.93ID:sulqQktu0962デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/21(月) 17:40:26.50ID:PNFNM3Vd0 > 現代の実装技術なら検出できないことはないはずなんだが、
ちゃんとやってるよ
外部参照名の長さの上限を増やすという
後方互換性を損なわない賢いやり方で
それの恩恵を有り難く頂戴しているのがC++
ちゃんとやってるよ
外部参照名の長さの上限を増やすという
後方互換性を損なわない賢いやり方で
それの恩恵を有り難く頂戴しているのがC++
963デフォルトの名無しさん (ドコグロ MMdf-RDjc)
2020/09/21(月) 20:06:59.96ID:CAa9Vr4hM 意味わからん
マンダリングしてるC処理系なんてあったっけ?
別にオブジェクトコードに含ませなくてもデバッグ情報に含ませといてチェックするとかでも良いと思うけどね
マンダリングしてるC処理系なんてあったっけ?
別にオブジェクトコードに含ませなくてもデバッグ情報に含ませといてチェックするとかでも良いと思うけどね
964デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/21(月) 21:16:44.87ID:PNFNM3Vd0 s/マンダリング/マングリング/g
965デフォルトの名無しさん (バッミングク MM4f-ejv8)
2020/09/21(月) 21:27:28.62ID:r8sxqPhqM >>963
32bitWindows向けのstdcallは引数等で使うスタックサイズを名前の後ろに付け加える
32bitWindows向けのstdcallは引数等で使うスタックサイズを名前の後ろに付け加える
966デフォルトの名無しさん (ワッチョイ 9f47-SP/v)
2020/09/22(火) 02:46:33.89ID:EwzeVKsQ0 本人が間違ってる分には無視すれば良いだけだが
初心者スレで嘘を撒き散らすのは良くないな
初心者スレで嘘を撒き散らすのは良くないな
967デフォルトの名無しさん (アウアウウー Sa5b-e7tI)
2020/09/22(火) 09:19:28.05ID:73EWHT9ca volatileオブジェクトへのアクセスは副作用を生じるというのを見たことがあるのですが
この場合の副作用とは具体的にはどういう事象のことを言っているのでしょうか?
この場合の副作用とは具体的にはどういう事象のことを言っているのでしょうか?
968デフォルトの名無しさん (ワッチョイ bfe9-Cup9)
2020/09/22(火) 09:29:18.39ID:GaogVwml0 >>967
具体例としては、 volatile なオブジェクトへのポインタを通したアクセスをメモリマップドI/Oと対応させることが多い。
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%83%89I/O
具体例としては、 volatile なオブジェクトへのポインタを通したアクセスをメモリマップドI/Oと対応させることが多い。
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%83%89I/O
969デフォルトの名無しさん (オイコラミネオ MMab-bB21)
2020/09/22(火) 11:37:01.89ID:duZr+LV8M >>967
遅くなることがあるということかな?
遅くなることがあるということかな?
970デフォルトの名無しさん (アウアウウー Sa5b-e7tI)
2020/09/22(火) 12:21:55.75ID:73EWHT9ca971デフォルトの名無しさん (アウアウエー Sadf-XGHE)
2020/09/22(火) 12:26:59.11ID:ZRR+59kRa 最適化によって、本来は必要な処理がコンパイラによって省かれてしまうとか
972デフォルトの名無しさん (アウアウエー Sadf-XGHE)
2020/09/22(火) 12:28:12.05ID:ZRR+59kRa コンパイラの判断によって、一部のコードが生成されないとか
973デフォルトの名無しさん (ワッチョイ 177f-PS54)
2020/09/22(火) 12:48:41.23ID:fNKq19I/0974デフォルトの名無しさん (ワッチョイ bfe9-Cup9)
2020/09/22(火) 13:01:07.61ID:GaogVwml0 >>970
副作用 (プログラム)
https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)
> プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。
C言語における定義はこんな感じ。
http://kikakurui.com/x3/X3010-2003-01.html#13
> ボラタイルオブジェクトへのアクセス,オブジェクトの変更,ファイルの変更,又はこれらのいずれか
> の操作を行う関数の呼出しは,すべて副作用(side effect)と呼び(11),実行環境の状態に変化を生じる。
副作用 (プログラム)
https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)
> プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。
C言語における定義はこんな感じ。
http://kikakurui.com/x3/X3010-2003-01.html#13
> ボラタイルオブジェクトへのアクセス,オブジェクトの変更,ファイルの変更,又はこれらのいずれか
> の操作を行う関数の呼出しは,すべて副作用(side effect)と呼び(11),実行環境の状態に変化を生じる。
975967 (アウアウウー Sa5b-e7tI)
2020/09/22(火) 17:15:02.44ID:73EWHT9ca 回答ありがとうございました
組み込みの資料か何かでvolatileの副作用についての記述があり質問させていただきました
副作用の意味がいまいち分かってないみたいなので勉強します
組み込みの資料か何かでvolatileの副作用についての記述があり質問させていただきました
副作用の意味がいまいち分かってないみたいなので勉強します
976デフォルトの名無しさん (ワッチョイ d602-lsHo)
2020/09/26(土) 02:24:05.62ID:AJ59WF/j0 int main(double a, double b)
{
printf("main");
}
{
printf("main");
}
977デフォルトの名無しさん (アウアウエー Saaa-LUZf)
2020/09/26(土) 02:27:39.44ID:80lZAyo5a コンパイル通るのかな….
978デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
2020/09/26(土) 05:50:57.90ID:JvTrRG8q0 (void)と(int, char**)以外は処理系定義
コンパイラが対応していれば適格
対応していなければ未定義
コンパイラが対応していれば適格
対応していなければ未定義
979デフォルトの名無しさん (ブーイモ MM5b-ODSS)
2020/09/27(日) 13:50:39.37ID:LQE5yA3hM crtstartupのお仕事だからコンパイラほぼ関係ないな
大抵の実用リンカは差し替えできるでしょ
大抵の実用リンカは差し替えできるでしょ
980デフォルトの名無しさん (ワッチョイ f793-raSa)
2020/09/28(月) 07:00:27.18ID: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++を使ってるけど、他の環境でも起きますか?
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++を使ってるけど、他の環境でも起きますか?
981デフォルトの名無しさん (ワッチョイ 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を超えています。これ以上書き込みはできません。
ニュース
- 国民 居住目的でない住宅所有者に「空室税」課せる法案を提出 ★2 [少考さん★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【EV新税】最大2万4千円で検討 28年から、普及妨げると異論も [蚤の市★]
- 「働いて働いて」の流行語大賞に懸念 「言葉が独り歩き」 過労自殺遺族 [尺アジ★]
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化へ 過去10年間に使用のメールアドレスや電話番号等も★3 [Hitzeschleier★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- 防衛省「中国側が出した記録は捏造」とは一言も表明せず、捏造言ってたネトウヨたちどうすんの? [469534301]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★1
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★2
- 【悲報】高市早苗、被災民に対し「自分の命くらいは自分で守ってくださいね」と切り捨てし大炎上 [339712612]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★2
- 【高市悲報】JA、発狂www「臨時に経費率を下げるので、どうかお米券を使ってください」 [246620176]
