!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
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0860デフォルトの名無しさん (ワッチョイ 6991-3XxJ)
2020/08/28(金) 14:09:17.18ID:Rsi3PU970 Poweshell 相手 なら UTF16で試してみて
861デフォルトの名無しさん (ワッチョイ a5bb-xiBb)
2020/08/29(土) 18:11:22.84ID:uw2IISYA0862デフォルトの名無しさん (ワッチョイ 27d2-XrX+)
2020/09/05(土) 12:34:48.17ID:inRyx+ft0 一時期ソースファイルで使われる文字コードと
テキストコマンドで指定される文字コードで混乱してた。
テキストコマンドで指定される文字コードで混乱してた。
863デフォルトの名無しさん (ワッチョイ 675f-th+2)
2020/09/05(土) 14:24:19.26ID:D6IgUwp/0 ファイルシステムもコードページあれば良いのに
864デフォルトの名無しさん (ワッチョイ 5f2f-yCsQ)
2020/09/08(火) 19:54:58.87ID:XpL2+zA20 すみません
visualstudio2019で
scanfてうまく動かないて
書き込みありまさしたが
こちらは初心者です
visualstudio2019で
scanfてうまく動かないて
書き込みありまさしたが
こちらは初心者です
865デフォルトの名無しさん (ワッチョイ 27b7-XrX+)
2020/09/08(火) 20:04:29.03ID:oUJlYCUI0 何がうまくいかないの?
866デフォルトの名無しさん (ワッチョイ e7e6-dQ4P)
2020/09/08(火) 20:07:28.59ID:SzSjgAIn0 >>864
母国語でおk
母国語でおk
867デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
2020/09/08(火) 20:33:38.44ID:h4K4tlm90 >>866
ماذا علي أن أفعل لتحسين عمل Scanf؟
ماذا علي أن أفعل لتحسين عمل Scanf؟
868デフォルトの名無しさん (ワッチョイ 5fa5-w/i8)
2020/09/08(火) 20:57:51.12ID:dd3/c9tT0 >>864
scanf_sを使うんだよ
scanf_sを使うんだよ
869デフォルトの名無しさん (ワッチョイ 27b7-XrX+)
2020/09/08(火) 21:00:35.32ID:oUJlYCUI0 自分が初心者だった頃を忘れて弱い者いじめするクズばっかり
870デフォルトの名無しさん (ワッチョイ 87e6-+pFZ)
2020/09/08(火) 21:38:18.70ID:L9CYXS2m0 ここの連中は初心者の時でもこんな愚かな質問しなかっただろうからな
871デフォルトの名無しさん (ワッチョイ 7f63-n8ne)
2020/09/08(火) 21:48:40.05ID:i07xiLbJ0 かまって欲しいだけだろう
872デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
2020/09/08(火) 22:29:20.68ID:h4K4tlm90 よしよし かまってあげよう おいで〜
873デフォルトの名無しさん (ワッチョイ 27bb-n8ne)
2020/09/08(火) 22:40:52.39ID:5p23t/CB0 (≧▽≦)きゃー
874デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
2020/09/08(火) 22:50:33.61ID:h4K4tlm90 (*-ω-)ヾ(・ω・*)ナデナデ
875デフォルトの名無しさん (ワッチョイ 1101-mScE)
2020/09/10(木) 22:31:27.77ID:XqO8hjOE0 >>869
ここ初心者向けじゃないし
ここ初心者向けじゃないし
876デフォルトの名無しさん (ワッチョイ f1b7-pVuC)
2020/09/11(金) 06:53:15.69ID:Cxw4gZ+X0 クズは認めるわけか
877デフォルトの名無しさん (ワッチョイ c5e6-nmCw)
2020/09/11(金) 09:46:30.88ID:t2oJFSgB0 この初心者のほうがよっぽどクズ
878デフォルトの名無しさん (ワッチョイ f1b7-pVuC)
2020/09/11(金) 11:05:17.65ID:Cxw4gZ+X0 クズを認めるからこそ比較できるわけだな
879デフォルトの名無しさん (ワッチョイ ea90-gr/N)
2020/09/11(金) 13:23:30.52ID:eRvWHPbG0 クズでもなんでもいいから正しい日本語を使って質問しなさい
880デフォルトの名無しさん (ワッチョイ f1b7-pVuC)
2020/09/11(金) 16:01:28.53ID:Cxw4gZ+X0 ほらな、質問者がクズかどうかは関係ないんだよ
881デフォルトの名無しさん (ワッチョイ 8d7f-sGGD)
2020/09/11(金) 17:04:12.34ID:ua52u3Jr0 お互い(屑であると)認め合う姿は美しいですね
882デフォルトの名無しさん (ワッチョイ b501-zsLS)
2020/09/12(土) 02:19:04.35ID:SzTm78BI0 静かになるまで5分かかりました(ry
883デフォルトの名無しさん (ワッチョイ 3628-oJ0F)
2020/09/14(月) 21:43:37.62ID:8/TQSAVT0 https://hnw.はてなブログ.com/entry/20130406
この記事(海外の質問箱の邦訳)に対するコメントで,
do{
...
} while (feof(input))
というコードが提案されているのですが,どう思われますか。
少なくとも一つの問題点(余分なループ)は克服できている気がしますが。
この記事(海外の質問箱の邦訳)に対するコメントで,
do{
...
} while (feof(input))
というコードが提案されているのですが,どう思われますか。
少なくとも一つの問題点(余分なループ)は克服できている気がしますが。
884デフォルトの名無しさん (ワッチョイ eaad-pVuC)
2020/09/15(火) 00:55:31.70ID:2J2Mo0F/0 >>883
コメントって、どこにあるの?
まあしかしそう書いたとしても c = fgetc(input) をやった直後の c の値が EOF かどうかを調べる必要があって、
EOF だったらループを抜ける必要がある。do { ... } while (feof(input)); のループ内に if ((c = fgetc(input)) == EOF) break; を
入れるとすると最後の while の条件は無駄だ。決して EOF に到達していないから。
コメントって、どこにあるの?
まあしかしそう書いたとしても c = fgetc(input) をやった直後の c の値が EOF かどうかを調べる必要があって、
EOF だったらループを抜ける必要がある。do { ... } while (feof(input)); のループ内に if ((c = fgetc(input)) == EOF) break; を
入れるとすると最後の while の条件は無駄だ。決して EOF に到達していないから。
885デフォルトの名無しさん (ワッチョイ 6da9-/xaV)
2020/09/15(火) 01:38:55.84ID:GcvmEeWM0 >>883
中身が空っぽなinputだったらどうする?
中身が空っぽなinputだったらどうする?
886デフォルトの名無しさん (ワッチョイ f1b7-pVuC)
2020/09/15(火) 07:29:42.10ID:YjwP830M0 後判定といえば自明な弱点があるね
887デフォルトの名無しさん (ワッチョイ 3628-oJ0F)
2020/09/15(火) 11:24:23.73ID:DboEcGlM0888デフォルトの名無しさん (ワッチョイ eaad-pVuC)
2020/09/15(火) 13:34:11.71ID:2J2Mo0F/0 ま、しかし、よくよく考えてみると feof() って使い所がほとんどないのではないか?
fgetc() が文字だけでなく EOF まで返す仕様になっているから使わずにも書けてしまうよね。
単にEOFになった後かどうかだけを調べたい場合は fgetc() 使ったら無駄な処理になるけど。
fgetc() が文字だけでなく EOF まで返す仕様になっているから使わずにも書けてしまうよね。
単にEOFになった後かどうかだけを調べたい場合は fgetc() 使ったら無駄な処理になるけど。
889デフォルトの名無しさん (ワイーワ2 FF92-e6VR)
2020/09/15(火) 13:46:37.73ID:i/gZOuAlF そもそも feof 使わないよね?って話題だし
890デフォルトの名無しさん (ワッチョイ 1163-pVuC)
2020/09/15(火) 14:02:51.06ID:pUsOBU6W0 fgetc()等はファイルを最後まで読み取った場合だけでなくエラーの場合もEOFを返すことになってるから
どちらの状況か区別するためにfeof(),ferror()はあるんだろ
区別しなくていいなら使わんわな
どちらの状況か区別するためにfeof(),ferror()はあるんだろ
区別しなくていいなら使わんわな
891デフォルトの名無しさん (ワッチョイ ea01-hEa4)
2020/09/15(火) 14:14:08.17ID:8CWM1WbO0 >>883
ダメダメって書いてあるやろ
rero
ferror の条件が成立した場合,feof の条件は成立せず,無限ループになる.
ループ脱出条件にはfread / fscanf / fgetc などの戻り値を使う.
feof は ferror との切り分けにのみ使う.
2014/02/04
ダメダメって書いてあるやろ
rero
ferror の条件が成立した場合,feof の条件は成立せず,無限ループになる.
ループ脱出条件にはfread / fscanf / fgetc などの戻り値を使う.
feof は ferror との切り分けにのみ使う.
2014/02/04
892883 (ワッチョイ 7f28-5uLG)
2020/09/16(水) 18:30:21.50ID:+0jueX8G0 ありがとうございました。
893デフォルトの名無しさん (ワッチョイ d793-lMKa)
2020/09/17(木) 12:37:14.53ID:3L04nVD50 関数定義の書式『例えばprintf関数なら、 int printf(const char * format, ...) 』とかで、関数の引数の型指定が含まれてるけど、これの指す具体的な意味って何?
例えば、const char*型が指定されていたとして、
1、「const char*型でなければならない」
2、「他の型も使えるがconst char*型を推奨する」
3、「色々と対応してるけど代表としてconst char*型を挙げる」
4、「1〜3のうちどれか、関数毎にケースバイケースで具体的には決まってない」
関数定義の書式における型指定には、どのような意味が込められてるんですか?
printf関数では、普通に文字列を入れた配列のポインタ(char *型)にも対応してるので、2か3なんだろうけども。
関数定義書式に含まれる型指定は、1〜4のどれなのか、C言語では統一的に指針が決まってますか?
例えば、const char*型が指定されていたとして、
1、「const char*型でなければならない」
2、「他の型も使えるがconst char*型を推奨する」
3、「色々と対応してるけど代表としてconst char*型を挙げる」
4、「1〜3のうちどれか、関数毎にケースバイケースで具体的には決まってない」
関数定義の書式における型指定には、どのような意味が込められてるんですか?
printf関数では、普通に文字列を入れた配列のポインタ(char *型)にも対応してるので、2か3なんだろうけども。
関数定義書式に含まれる型指定は、1〜4のどれなのか、C言語では統一的に指針が決まってますか?
894デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
2020/09/17(木) 12:40:32.43ID:OW2OZx8DF 1
895デフォルトの名無しさん (ワッチョイ d793-lMKa)
2020/09/17(木) 12:50:38.33ID:3L04nVD50 printf関数の場合では、「char*型が使えるように見えるけど、色々と問題起きるからconst char*型以外は禁止」ということなんですか。
分かりました。
分かりました。
896デフォルトの名無しさん (ドコグロ MMdf-aBI4)
2020/09/17(木) 12:53:34.67ID:uk2B69G8M const char*はchar*の指す先を書き換えないだけで同じものなのでconst char*をchar*で初期化してなんの問題もない。暗黙変換してくれる。
逆は書き換えられないconst char*が書き換えできる様になってしまうので暗黙にはしない様になっている。
逆は書き換えられないconst char*が書き換えできる様になってしまうので暗黙にはしない様になっている。
897デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 13:02:01.33ID:9/9M+ZB20 こんなこともできるけどね
static /* const */ char str[] = "hello stupid people";
printf(str);
static /* const */ char str[] = "hello stupid people";
printf(str);
898デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
2020/09/17(木) 13:08:31.54ID:OW2OZx8DF 質問のレベルから忖度すると
質問者が気にしてるのは
ひょっとすると
...
の部分の方なのかも知れない
質問者が気にしてるのは
ひょっとすると
...
の部分の方なのかも知れない
899デフォルトの名無しさん (ワッチョイ f77c-E8AY)
2020/09/17(木) 13:10:16.65ID:/CJv2N4s0 #include <stdio.h>
int main(int ac, char **av)
{
int p = 0x000a0d41;
printf((char *)&p);
return 0;
}
int main(int ac, char **av)
{
int p = 0x000a0d41;
printf((char *)&p);
return 0;
}
900デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
2020/09/17(木) 13:40:44.35ID:PwEIVjdJ0 関数定義の引数が配列で書けるようになったのはいつから
int func(array[5]){
.......
}
int func(array[5]){
.......
}
901デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 13:45:22.35ID:9/9M+ZB20 型指定子がないけど暗黙intってことか? 無理だと思うけど
902デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
2020/09/17(木) 13:46:44.16ID:OW2OZx8DF 昔から
903デフォルトの名無しさん (ワッチョイ 177f-mv5V)
2020/09/17(木) 13:52:07.27ID:qRMpu/GI0 >>899
明示変換してるのに暗黙変換もさせるのは読みづらいよ
明示変換してるのに暗黙変換もさせるのは読みづらいよ
904デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 13:55:11.12ID:9/9M+ZB20 つーかさ
pにアドレス演算子つけてるの
何かがわかってない兆候じゃね?
pにアドレス演算子つけてるの
何かがわかってない兆候じゃね?
905デフォルトの名無しさん (ワッチョイ d793-lMKa)
2020/09/17(木) 14:31:37.44ID:3L04nVD50 皆さんのレスを行間を読んでまとめること、こんな感じの理解でいいですか?
代入の際、右辺の値は、左辺の型に暗黙変換される。
int a = 3.5; // duble型リテラルを暗黙変換してaには3が入る
int a = 'a' // const char型?リテラルを暗黙変換してaには文字コードを表す97が入る
int a ="ほげ"; // const char型リテラルを暗黙変換してaにはよくわからん不正値が入る
同様に、関数へ引数を渡すことも代入の一種であり、実引数が代入する側であるから代入式の右辺に相当し、仮引数が代入される側であるから左辺に相当する。
その際、実引数char*型は仮引数const char*型へ暗黙変換される。
int main(void) {
char hoge[] = "ほげ";
printf(hoge); // 実引数hogeは先頭要素を指すポインタchar*型で、暗黙変換を伴って仮引数のconst char*型となる
}
この逆、仮引数char*型に実引数const char*型を渡すのはNG。char*型とわざわざ指定されてる理由は、値を書き換え可能なポインタを求めるためであり、const char*型はダメ。
代入の際、右辺の値は、左辺の型に暗黙変換される。
int a = 3.5; // duble型リテラルを暗黙変換してaには3が入る
int a = 'a' // const char型?リテラルを暗黙変換してaには文字コードを表す97が入る
int a ="ほげ"; // const char型リテラルを暗黙変換してaにはよくわからん不正値が入る
同様に、関数へ引数を渡すことも代入の一種であり、実引数が代入する側であるから代入式の右辺に相当し、仮引数が代入される側であるから左辺に相当する。
その際、実引数char*型は仮引数const char*型へ暗黙変換される。
int main(void) {
char hoge[] = "ほげ";
printf(hoge); // 実引数hogeは先頭要素を指すポインタchar*型で、暗黙変換を伴って仮引数のconst char*型となる
}
この逆、仮引数char*型に実引数const char*型を渡すのはNG。char*型とわざわざ指定されてる理由は、値を書き換え可能なポインタを求めるためであり、const char*型はダメ。
906はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 14:32:12.65ID:FojOL81h0 >>900
型が書かれていないけどそれはタイプミスだとすれば、
配列形式で仮引数を書くこと自体は昔から出来る。
ただし、配列形式で書かれるとそれはポインタに調整される。
たとえば仮引数が int array[5] だったら int* array と全く同じとみなされる。
配列の大きさの情報は無視される。
(ひょっとすると警告を出すためのヒントにするくらいの処理系はあったりするのかもしれんけど。)
型が書かれていないけどそれはタイプミスだとすれば、
配列形式で仮引数を書くこと自体は昔から出来る。
ただし、配列形式で書かれるとそれはポインタに調整される。
たとえば仮引数が int array[5] だったら int* array と全く同じとみなされる。
配列の大きさの情報は無視される。
(ひょっとすると警告を出すためのヒントにするくらいの処理系はあったりするのかもしれんけど。)
907はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 14:42:51.44ID:FojOL81h0 >>905
暗黙の変換がされる場合とされない場合はあって、
int a ="ほげ";
で暗黙の変換をする保証はない。
C99 だと単純代入で許される型の組み合わせは 6.3.16 に書かれている。
処理系の拡張としてやっちゃうこともあるかもしれんけど、
その場合でも警告は出るんじゃないかなぁ。
> 関数へ引数を渡すことも代入の一種であり
その通りだが、関数原型 (プロトタイプ) がない場合や
可変長引数 (仮引数が ... で表されるやつ) の場合はちょっとルールが特殊な部分もある。
まちがっててもコンパイラが検出できないこともあるので気を付けないといけない。
暗黙の変換がされる場合とされない場合はあって、
int a ="ほげ";
で暗黙の変換をする保証はない。
C99 だと単純代入で許される型の組み合わせは 6.3.16 に書かれている。
処理系の拡張としてやっちゃうこともあるかもしれんけど、
その場合でも警告は出るんじゃないかなぁ。
> 関数へ引数を渡すことも代入の一種であり
その通りだが、関数原型 (プロトタイプ) がない場合や
可変長引数 (仮引数が ... で表されるやつ) の場合はちょっとルールが特殊な部分もある。
まちがっててもコンパイラが検出できないこともあるので気を付けないといけない。
908デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 16:23:39.93ID:9/9M+ZB20 処理系の拡張ねえ
gccは-pedanticつけないと黙って通す場合あるかんな
>>905
void func(char *);
func("const char array");
これconst違反なのにできちまう
gccは-pedanticつけないと黙って通す場合あるかんな
>>905
void func(char *);
func("const char array");
これconst違反なのにできちまう
909デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
2020/09/17(木) 17:46:14.08ID:7hPXgG620910はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 18:43:35.04ID:FojOL81h0 >>908
C の文字列リテラルは char の配列ということになっているので char* で受け取れる。
型の視点で見ればそのコードに const は登場しない。
文字列リテラルを書き換えようとした結果は未定義であるにもかかわらず
型に const が付かない C のクソなところのひとつ。
(C++ では文字列リテラルの型には const が付く。)
C の文字列リテラルは char の配列ということになっているので char* で受け取れる。
型の視点で見ればそのコードに const は登場しない。
文字列リテラルを書き換えようとした結果は未定義であるにもかかわらず
型に const が付かない C のクソなところのひとつ。
(C++ では文字列リテラルの型には const が付く。)
911デフォルトの名無しさん (ワッチョイ d793-lMKa)
2020/09/17(木) 19:21:07.83ID:3L04nVD50 よく見てみたら使ってるツールがC++用だった。
C言語入門本でインストールを促すソフトが大抵Visual StudioのC++で、
意識せずにC++の開発環境でC言語の勉強をしてたんだな。
それで、C言語の挙動だと思ってたのが、実はC++の挙動だったんだな。const の件もそう。
C言語入門本でインストールを促すソフトが大抵Visual StudioのC++で、
意識せずにC++の開発環境でC言語の勉強をしてたんだな。
それで、C言語の挙動だと思ってたのが、実はC++の挙動だったんだな。const の件もそう。
912デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 19:39:01.71ID:9/9M+ZB20913デフォルトの名無しさん (ラクッペペ MM8f-kMIc)
2020/09/17(木) 19:55:04.93ID:+PkSrmT3M いくら引数リストに要素数を記述してもコンパイラは無視する
int func(int **array)と同じ扱いでただのニ重ポインタ
int func(int **array)と同じ扱いでただのニ重ポインタ
914デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 19:57:19.31ID:9/9M+ZB20 >>913
アホwバカwww
アホwバカwww
915デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
2020/09/17(木) 19:58:54.02ID:9/9M+ZB20 char **aho = 0;
printf("%p ", aho);
aho++;
printf("%p ", aho);
printf("%p ", array);
array++;
printf("%p ", array);
printf("%p ", aho);
aho++;
printf("%p ", aho);
printf("%p ", array);
array++;
printf("%p ", array);
916デフォルトの名無しさん (ワッチョイ d793-lMKa)
2020/09/17(木) 19:59:49.49ID:3L04nVD50 でもまあプログラムの再利用性を考えたら、constの件は、C++仕様に配慮して省かないことが大事か。
C++に配慮したコードを書くことで、C言語でもC++でも通用するプログラムとなり、プログラムの再利用性が上がる。
C言語ではconstを省くことが文法的には認められてても・・・・・C++に流用できないプログラムは、たぶんコードとしては減点となる。
C++に配慮したコードを書くことで、C言語でもC++でも通用するプログラムとなり、プログラムの再利用性が上がる。
C言語ではconstを省くことが文法的には認められてても・・・・・C++に流用できないプログラムは、たぶんコードとしては減点となる。
917デフォルトの名無しさん (ラクッペペ MM8f-kMIc)
2020/09/17(木) 20:03:53.36ID:FZAv8QRcM918はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 20:05:11.15ID:FojOL81h0919はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 20:08:22.99ID:FojOL81h0 >>917
配列を渡すのではなく「配列へのポインタ」だ。
配列は多くの場合に配列の先頭要素を指すポインタに暗黙に型変換されるけども、
それとは別に配列を指すポインタというものが存在し、
指す先の配列の大きさは型情報として保存される。
配列を渡すのではなく「配列へのポインタ」だ。
配列は多くの場合に配列の先頭要素を指すポインタに暗黙に型変換されるけども、
それとは別に配列を指すポインタというものが存在し、
指す先の配列の大きさは型情報として保存される。
920デフォルトの名無しさん (ラクッペペ MM8f-kMIc)
2020/09/17(木) 20:13:48.15ID:9q71Nrm0M 関数の引数として配列を渡す場合、アドレスと要素数は別に渡す必要がある
関数内で要素数を知る手段はない
int func(int **array, int i, int j)
関数内で要素数を知る手段はない
int func(int **array, int i, int j)
921はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 20:14:06.25ID:FojOL81h0 int array[][5] という配列があったとしたら、その先頭要素の型は int [5] なので、
通常通り配列の先頭要素そ指す型に型変換したら int (*)[5] になるんだ。
仮引数の側もそれと同じような調整が入る。
通常通り配列の先頭要素そ指す型に型変換したら int (*)[5] になるんだ。
仮引数の側もそれと同じような調整が入る。
922デフォルトの名無しさん (ラクッペペ MM8f-kMIc)
2020/09/17(木) 20:19:02.57ID:9q71Nrm0M それは配列の変数宣言の場合だ
仮引数の場合には当たらない
仮引数の場合には当たらない
923はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 20:29:34.78ID:FojOL81h0924デフォルトの名無しさん (ラクッペペ MM8f-kMIc)
2020/09/17(木) 20:31:16.69ID:JChOP/F3M だから糖衣構文だと言ってるだろ
925はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
2020/09/17(木) 20:32:41.07ID:FojOL81h0 >>916
正直言って、const のありがたみが今一つよくわからないんですよね…
正直言って、const のありがたみが今一つよくわからないんですよね…
927デフォルトの名無しさん (ワッチョイ 17da-o3gE)
2020/09/17(木) 21:37:33.81ID:VrEKPYEi0 確認してみた
配列が仮引数の関数内で配列の型情報は失われて単なるポインタになってる
メイン関数内配列サイズ 20Byte (int[5] = 4Byte * 5)
関数内配列サイズ 8Byte (int* = 64bit)
https://i.imgur.com/nItgOZC.png
配列が仮引数の関数内で配列の型情報は失われて単なるポインタになってる
メイン関数内配列サイズ 20Byte (int[5] = 4Byte * 5)
関数内配列サイズ 8Byte (int* = 64bit)
https://i.imgur.com/nItgOZC.png
928デフォルトの名無しさん (ラクッペペ 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したりするんです?
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 今年の漢字 [ぐれ★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★4 [蚤の市★]
- 今年の漢字は「熊」に決定! 相次ぐクマ被害 去年は「金」 [冬月記者★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ★3 [冬月記者★]
- あぼーん
- 「『券』を期待している?」鈴木農水相の今年の漢字は「苗」 理由は「おこめ券話題に…」 [蚤の市★]
- 一人殺したい奴がいる
- 【速報】今年の漢字、「熊」!wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 残クレタワマン、始まるwwwwwwwwwwwwwwwwwwwwwwwww [329329848]
- 【速報】今年のゲームオブザイヤー、Clair Obscur: Expedition 33 [779938112]
- お前ら俺の船に乗れ!ドン!!!!⛴🏡
- 【毎日新聞】高市首相の「アイドル化」?若年層、同じ政策でも変化する評価 [718678614]
