C言語なら俺に聞け 157at TECH
C言語なら俺に聞け 157 - 暇つぶし2ch1:デフォルトの名無しさん
21/06/28 11:22:51.50 so+vl3vs0.net
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)
C11
URLリンク(www.open-std.org)
C99
URLリンク(www.open-std.org)
URLリンク(kikakurui.com)
C FAQ 日本語訳
URLリンク(www.kouno.jp)
JPCERT C コーディングスタンダード
URLリンク(www.jpcert.or.jp)
※前スレ
C言語なら俺に聞け 156
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

2:デフォルトの名無しさん
21/06/28 11:26:33.76 so+vl3vs0.net
前スレ末期の流れを再掲
> 996 自分:デフォルトの名無しさん (ワッチョイ 0f45-Sffs)[sage] 投稿日:2021/06/28(月) 09:33:23.09 ID:so+vl3vs0 [1/2]
> printf("%d", sizeof (char)123); とやろうとしたら
> キャストのカッコがsizeofのカッコと解釈されてエラーになるのな
> printf("%d", sizeof((char)123)); ならおkなんだけど
> なんだか気持ち悪い
>
> 997 返信:デフォルトの名無しさん (ワッチョイ cf05-Ibo0)[sage] 投稿日:2021/06/28(月) 10:13:18.97 ID:x/UkG1ge0
> >>996
> sizeofって括弧なしで使えるの? 知らなかった
>
> 998 返信:デフォルトの名無しさん (ワッチョイ 0fda-qjGA)[sage] 投稿日:2021/06/28(月) 10:20:43.69 ID:WejOUFlX0
> >>996
> sizeof演算子の優先順位はcast演算子の優先順位より高いので、括弧がないと
> まず最初にsizeofと数値リテラルが評価されてその後でその結果をcastで評価するという
> おかしな状態になるのでエラーになったのでは?
>
> 999 自分:デフォルトの名無しさん (ワッチョイ 0f45-Sffs)[sage] 投稿日:2021/06/28(月) 10:38:03.51 ID:so+vl3vs0 [2/2]
> sizeofとキャストはどちらも単項式なので右から結合するはず
> にも関わらずキャストが先に読まれないので気持ち悪いと言ったんだ
> 字句解析と意味解析ってことかな
>
> 1000 名前:デフォルトの名無しさん (ワッチョイ 0fd2-kMi9)[] 投稿日:2021/06/28(月) 11:05:48.75 ID:HW6dR9O/0
> そもそも
> sizeof (char)
> paだけでいいものをそう記述してるのが気持ち悪い。

3:デフォルトの名無しさん
21/06/28 11:28:49.59 so+vl3vs0.net
>>前スレ1000
いやcharのサイズが知りたいのではなく
キャスト式(char)123のサイズを調べようとしたんだ
Cはchar変数の値を使おうとするとintに拡張するし文字定数もint型なので
char型の値を持つ式なんてあるのかって

4:デフォルトの名無しさん
21/06/28 11:37:03.08 XSoi24UgM.net
cppreferenceのc operator precedenceの項の注釈によるとオペアンドはtype castにはできないって書いてあるね。ただ仕様書の該当箇所は探せなかった

5:デフォルトの名無しさん
21/06/28 11:58:43.53 so+vl3vs0.net
脚注2は俺が気持ち悪いと言ったことと似てるけどsizeof(int)*pが
(sizeof(int)) * pという算術乗算になるという話なら単項式のsizeofより優先順位が低いからまだわかる

6:デフォルトの名無しさん
21/06/28 12:57:31.08 XSoi24UgM.net
A.2.1が引用元みたいなんで読んでみるとsizeof (int)123はダメだね。
sizeof +(int)123なら動くようだ。sizeof (int){1}も動きそう。

7:デフォルトの名無しさん
21/06/28 15:54:14.85 so+vl3vs0.net
あーそうか
A.2.1. (6.5.3)では
unary-expressionに該当するものの1つに
unary-operator cast-expressionがあるけど
unary-operatorにキーワードsizeofが含まれず、
カッコなしのキャスト式は
sizeof unary-expressionとなっていて
sizeof cast-expressionではないってことか

8:デフォルトの名無しさん
21/06/29 00:32:13.44 jRoYjmsV0.net
ところで sizeof((char) 123) と sizeof(char) って同じことだよな?

9:デフォルトの名無しさん
21/06/29 01:01:59.00 cYz04uBKM.net
ポインタキャストは敷居線さえ跨がなきゃ思い通りの値出てくるけど
数値キャストは難しいんだよな

10:デフォルトの名無しさん
21/06/29 01:04:11.67 lZY/6JCta.net
>>8
GCC 9.3.0 では両方とも 1 でした

11:デフォルトの名無しさん
21/06/29 01:05:05.10 cYz04uBKM.net
printf さんの独自性もあるし

12:デフォルトの名無しさん
21/06/29 02:00:52.74 jRoYjmsV0.net
>>10
ていうかやるまでもなく結果が同じにならないとおかしいよね。
一方は値を char 型にキャストしているんだから sizeof の結果は char 型のサイズになる。
もう一方は char 型のサイズを求めているから char 型のサイズになる。

13:はちみつ餃子
21/06/29 04:29:15.93 OP5z1lEO0.net
二項演算子のいくつかでは汎整数拡張が適用されることになっているが
sizeof に渡す分には char のオブジェクトは char のオブジェクトだよ。

14:デフォルトの名無しさん
21/06/29 08:37:44.49 F75/2W0I0.net
char型 + char型 の式でもint型に拡張されるんだっけ?

15:デフォルトの名無しさん
21/06/29 13:20:32.79 f0Xm8hptd.net
もち
単項プラスでさえ拡張する

16:デフォルトの名無しさん
21/06/29 13:41:07.94 dKjX5GmV0.net
typedefによる新しい型の定義って、コンパイラの工程的にはどの工程で定義されるの?
字句解析?構文解析?プリプロセスじゃないよね

17:デフォルトの名無しさん
21/06/29 14:16:01.66 NxeKtV2S0.net
質問が間違ってる気がするけどね。
コンパイルレベルで処理されるのか、リンクするまで処理されないのか、でしょ。
で、typedefは前者

18:デフォルトの名無しさん
21/06/29 20:18:28.43 SX14oDOe0.net
翻訳段階の何番目でやってんのかって質問だろ

19:デフォルトの名無しさん
21/06/29 20:52:30.02 0ahpifum0.net
構文解析の後 typedef と認知したうえで、シンボルのテーブルに追加してかないと
置換?読み替え?はできないよねぇ…
C言語は、その構造上1回の通読では解決できないんだっけ?

20:デフォルトの名無しさん
21/06/29 21:06:15.61 SX14oDOe0.net
5.1.1.2 Translation phasesくらい読んでから来いよ

21:デフォルトの名無しさん
21/06/29 22:00:49.44 NxeKtV2S0.net
だからぁw
構文解析ってのはパーサね?w←これは例えばbisonで作るやつね?w
字句解析ってのはレキシカルアナライザね?w←これは例えばflexで作るやつね?w
レキシカルアナライザかパーサかって、そもそもレキシカルアナライザってのは
字句区切るだけだよwそれをどんな命令であるかを解釈を決めるのが構文解析ねw
コンパイルの1pass,2passって話なら、まあそれでもいいけどさw
用語がでたらめすぎんでしょ。
だいたいそんなこと知ってどうするんだよ?w

22:デフォルトの名無しさん
21/06/29 22:05:17.86 gp7v5PNW0.net
セキュリティホール探し?

23:デフォルトの名無しさん
21/06/29 23:35:14.00 dKjX5GmV0.net
Cの構文解析器実装してるんだけどBNFのtypedefの扱いがイミフなんだよねー

24:デフォルトの名無しさん
21/06/29 23:57:55.23 NxeKtV2S0.net
>>23
またぁw
BNF関係ないでしょうw
つか、typedefなんて意味不明なんてことはないと思うけど。
特定の記法のことを指してるの?BNFで書かれた
typedefの規則が読みとれないって言ってるの?w
typedef struct {...};

struct {...} xxx;
を区別できないとかそんな話?
よくわかんないけど、変に切り出すんじゃなくて、
ストレートにこれがやりたいけど、これどうしたらいいか
わかんない、って聞く方がいいと思うんだが。
なにいってんだか、知ってる人ほど却ってわかんねーと思うんだが。

25:デフォルトの名無しさん
21/06/30 00:35:54.93 dsegDYOD0.net
typedefがstorage-class specifierに属してることを言ってるなら
構文上の便宜のためだけ(for syntactic convenience only)って6.7.1(5)に書いてあるけど
Annexのsyntax summaryだけ見てる感じかな
かなりエスパーしてるから的外れだったらすまぬ

26:デフォルトの名無しさん
21/06/30 01:02:59.78 xHlidKVh0.net
みなさんレスありがとう
「C BNF」でググって一番上に出るBNFを参考に実装しているんだけど、BNFが古いせいかtypedefの構文が欠落してるような気がして(気のせいでした。↓のレス参照)
でも<typedef-name>という要素はあるからtypedef機能自体はあるらしい
BNFに書いてないってことは構文解析以前の処理になるのかもしれないと思ってここで聞いてみたんだけど
混乱した人もいるみたいですまない
>>25
あー!そういうことですか
なるほど疑問が解けました
typedefをspecifierで扱ってるわけですね
ありがとうございます

27:デフォルトの名無しさん
21/06/30 06:48:58.92 tpFz8l2w0.net
typedefがないってことはK&R Cか
規格票でもドラフトでもいいから拾って読んでみ
URLリンク(www.open-std.org)

28:デフォルトの名無しさん
21/06/30 09:43:56.46 xHlidKVh0.net
>>27
参照してるBNFはおそらくK&R Cですね
関数の宣言が古いスタイルになっているので
ありがとうございます、参照してみます

29:デフォルトの名無しさん
21/07/17 09:12:05.75 17h8nqYk0.net
リスト型構造体配列って他の言語でもあるのでしょうか?
現在職業訓練で勉強中なのですが、独学でやらないといけない範囲のようでして、
時間的余裕があまりない状態です。
他言語でも似たような考えが出てきて、Cで覚えておくと役立つなど
ございましたら、頑張って挑戦してみようと思っています。

30:デフォルトの名無しさん
21/07/17 12:16:52.25 xP6i4weKM.net
リスト型構造体配列ってのは講師の人の自作用語?
それなら定義を示してもらわんと。

31:デフォルトの名無しさん
21/07/17 12:38:05.00 +M7J9sQi0.net
リンクリストなら他の言語にもある
普通は配列とは言わないからその言葉は謎だけど……

32:デフォルトの名無しさん
21/07/17 13:34:21.36 e6axNbpd0.net
ポインタの代わりに配列のインデックスを保持してるような感じなのかね?
リスト型構造体配列

33:デフォルトの名無しさん
21/07/17 16:17:40.91 USprSk230.net
C99かそれ以降の標準的な環境において
(bool)someval

!!someval
って(例外なしに)全くおなじ効果を生むと思っていいですか。
前者はJISX3010の6.3.1.2などで「値が0になるなら0,それ以外なら1」と書かれている一方,
後者は(初学者なので経験がなく,正しい認識ではないかもしれませんが)慣用的な書き方なので
規格票にも書かれておらず,正確に同じ意味なのかどうかを確かめられませんでした。

34:デフォルトの名無しさん
21/07/18 00:36:46.74 vIcCvIPT0.net
>>33
「意味するところは全く違うが、結果だけ見れば全く同じ」です。

35:デフォルトの名無しさん
21/07/18 01:19:32.77 euqgtMPHa.net
bool型が導入されたことで得られるメリットはは何かあるでしょうか
またデメリットはあるでしょうか

36:デフォルトの名無しさん
21/07/18 07:53:07.50 OEfNT0QGM.net
メリットは、必ず真偽値になること
デメリットは、必ず真偽値になってしまうこと
例えばエラーコードのようにいい加減な経緯で拡張していくことはできない

37:ハノン
21/07/18 09:54:45.66 9YAoR/6C0.net
>>35
ctypes.h の isalpha() とか islower() とかその他大勢は、偽のときは 0 を必ず返しますが、真のときは 1 とは限らない 0 でない別の数を返したりするんですよ
そういうのは紛らわしいので、そういう紛らわしさが減る bool の存在はありがたいですね

38:デフォルトの名無しさん
21/07/18 16:58:13.77 jPlpwmsoF.net
関数の () は演算子
キャストの () は演算子
だそうですが
数学の数式で優先度上げるのに相当する () は演算子ですか?

39:デフォルトの名無しさん
21/07/18 17:14:40.88 6AMrYKMS0.net
いいえ

40:デフォルトの名無しさん
21/07/18 20:03:28.13 i83/r50ia.net
>>34
ありがとうございます!

41:33
21/07/18 20:08:43.08 i83/r50ia.net
>>34
すんません
入力欄間違えました。

42:はちみつ餃子
21/07/18 21:49:36.58 +Ch+KzUq0.net
>>33
真偽値型にキャストした結果の型は _Bool で、 !! を通した型は int という違いはある。
URLリンク(wandbox.org)
整数を扱う多くの場合では整数拡張が入ったりして違いが吸収
されてしまうからどちらでもいい場合がほとんどだと思うけど、
あらゆる状況で完全に同じとは言い切れない。
ちなみに C++ では整数に ! を適用した結果は bool なので、
もちろん !! の結果も bool になる。

43:デフォルトの名無しさん
21/07/18 21:52:36.39 V2Gw1I3v0.net
>>38
違う
一次式を囲む()は
後置式に属する関数呼び出しの()でも
単項式に属するキャスト記法のキャストの()でもない

44:デフォルトの名無しさん
21/07/18 22:42:35.27 4j3GDjyk0.net
>>42
_Generic 便利ですね……。C11から追加されたんだ。

45:デフォルトの名無しさん
21/07/18 22:44:22.95 4j3GDjyk0.net
>>38
ほとんど関係ないけど,Haskelだと優先度を上げる()記法を
$演算子で代用できるから,
「優先度を上げる()を演算子としてみる」というのはそう不自然ではないかも。
でも(たぶん)C言語だとそういうことはない。

46:デフォルトの名無しさん
21/07/19 17:37:03.07 3YhpibAgF.net
こういう認定試験用にC言語勉強するときって
URLリンク(www.sikaku.gr.jp)
32bit版のコンパイラの方が良いんでしょうか?
64bit版でintとかsize_tとかサイズ変わると困りませんか?

47:デフォルトの名無しさん
21/07/19 17:41:05.09 GP2gJIPC0.net
逆にsizeof(size_t)が返す値が処理系定義であることを考え落とす癖がつくと
そこを弱点として狙われるぞ

48:はちみつ餃子
21/07/20 15:47:40.82 BjsPOMc70.net
変わって困ることならむしろ困ってみたほうが勉強になるんじゃね。

49:デフォルトの名無しさん
21/07/20 17:03:23.21 2ecX9oPqF.net
> 1級で使用する環境について(公開試験)
コンパイラ Borland C++ Compiler 5.5
JIS X 3010-1993に対応
エディタ TeraPadまたはメモ帳
文字コード:SHIFT-JIS、改行コード:CR+LF
※当コンパイラの操作にはコマンドプロンプトの知識が必要です。
※解答用のソースプログラムは、SHIFT-JISで保存してください。
※指定した保存形式で保存されていない場合は、採点の対象となりません。
・・・なんだかなぁ

50:デフォルトの名無しさん
21/07/20 18:27:33.17 rDNdpvsmK.net
せめてC99対応コンパイラにしようよ

51:デフォルトの名無しさん
21/07/20 18:37:29.47 LjuPHZpl0.net
JISX 3010 1993で使えない構文や関数を回避して回答する能力を受験者に課すなんてなかなか高度な試験だね

52:デフォルトの名無しさん
21/07/20 20:03:33.02 Plw9uEZeM.net
BCCってまだVSの無料版が無かった頃に無料で使えるコンパイラとして粂井氏のHPで紹介されてて使ってたなあ
その時代から何も進化してない資格なんだろうな……

53:デフォルトの名無しさん
21/07/21 00:20:28.07 fGno+40ia.net
bccとかLSI-C(試食版)とか、Cマガの付録で

54:デフォルトの名無しさん
21/07/21 07:39:41.26 A0/pIuIc0.net
BCCは知ってても それだけじゃ困ります

55:デフォルトの名無しさん
21/07/21 09:12:39.48 +0/niNvm0.net
> JIS X 3010-1993に対応
つーことは
int main(void)
{
printf("");
int x; /* これがダメ */
//このコメントもダメ
for(int y = 0; y < 1; y++) ; //これもダメ
}
今どきのコンパイラはみんなOKなのに
うっかり使うと減点されるという陰険な罠だな

56:デフォルトの名無しさん
21/07/21 09:45:21.46 DbniEar00.net
検定する側が時代遅れで
しかもこんなレベルじゃ
最早コボちゃん世代を嗤えませんね?

57:はちみつ餃子
21/07/21 10:08:36.90 tIqEOSex0.net
まあそういう時代もあったというのは知識として有るに越したことは無いが、
前提とされるとだいぶんしんどいな。

58:デフォルトの名無しさん
21/07/21 11:16:37.45 CAhJ9aCx0.net
じじい度検定になっとる

59:デフォルトの名無しさん
21/07/21 20:55:54.33 NQ6A/S1F0.net
Cの範囲内なのにえらいストレスフルやな
//コメントや for 内の変数宣言が禁じられると辛い

60:デフォルトの名無しさん
21/07/21 21:11:33.77 kmyfY3M8M.net
だんだんいじくり回されてワケわからん言語になるんだろうな

61:はちみつ餃子
21/07/21 22:43:38.51 tIqEOSex0.net
>>60
あまり変更するのもどうかと思うけど
昔のままで良しというわけにもいかん部分もあるし、
現実的な妥協点をさぐりながら改定していくしか仕方がないだろ。

62:デフォルトの名無しさん
21/07/22 00:04:04.57 0pHC70l40.net
今日,O'rellyの『Lex & Yacc』で「自己参照型構造体」という概念を知ったんだけど,
これが動作する理屈とかこういう書き方をする利点がマジでわからなくて苦戦してる。
でもこれを理解できるようになればメモリ確保やポインタ参照の話がわかるようになる……
と期待してがんばる。

63:はちみつ餃子
21/07/22 00:13:03.51 r7I3CYuM0.net
基本的なメモリ管理をわからない段階で yacc の本を読んでるのか。
実用を通して理解するのもひとつの道ではあるだろうけど、
最初はもっと単純な事例集みたいなのを見るほうがいいと思う。

64:蟻人間
21/07/22 00:14:52.69 24/oAOWdd.net
>>62
言わば再帰的定義の産物だよ。
論理的に入れ子の構造にする訳。
ヌルポインタで終わり。

65:デフォルトの名無しさん
21/07/22 09:38:36.05 ERrrf0sq0.net
自分が興味あることから掘り下げて行くのはいいと思うよ
とりあえず C言語 リスト構造 とかでググってみて

66:デフォルトの名無しさん
21/07/22 10:14:39.29 I7nexIleF.net
struct A { A a; }; ではないからな
struct A { A *p; }; ならただのポインタ

67:デフォルトの名無しさん
21/07/22 10:53:20.02 kFdJ5CFB0.net
Ruby は、Bison, flex だったか?

68:デフォルトの名無しさん
21/07/22 12:38:58.69 0pHC70l40.net
>>63
「勉強不足」といわれればそれはその通りなんだけど
寧ろC言語のやっかいな部分にできるだけ触らないですむように
という動機でlexとyaccを学んでるんですよね……。
↑まあこういう考え方が間違ってるかもということに
『Lex & Yacc』を読んでいて気付きはじめていますが……
>>65
こういう↓ことですよね。
URLリンク(dev.grapecity.co.jp)
実は『Lex & Yacc』内ではそのコード概念の名前はでてこなくて
コード断片でggったりしてました。

69:デフォルトの名無しさん
21/07/22 12:48:57.06 MMqyZQ9/0.net
>>66
- A *p;
+ struct A *p;
ここはCスレだぞ
struct A
{
struct A a; //incomplete typeなのでオブジェクトは定義できない
};

70:デフォルトの名無しさん
21/07/22 14:18:45.83 I7nexIleF.net
「自己参照型」っていうのが
誤訳なんじゃないかって思ってる
実際には「自己型参照型」でしかない
ポインタを代入するときに自分自身(オブジェクト)のポインタを代入する訳じゃないから
自己を参照してる訳じゃないんだ
ここを誤解するから理解が進まない
>>69 君には伝わってるから良いよ

71:デフォルトの名無しさん
21/07/22 14:34:42.13 MMqyZQ9/0.net
ISO: self-referential structure
JIS: 自己参照する構造体
誤訳かねえ

72:デフォルトの名無しさん
21/07/22 14:50:14.55 G9vEgy1w0.net
int arg;
p = (*p)(arg);
戻りが関数(A)のポインタとなる 引数int を取る関数(A) の宣言もまた
記述が無理な事案ですかの

73:デフォルトの名無しさん
21/07/22 15:29:46.76 kFdJ5CFB0.net
自己参照型は、2分木とか?
親は、2つの子のポインターを持っていて、それが再帰的に続くもので、
親子は同じ構造をしているもの

74:はちみつ餃子
21/07/22 16:19:06.28 r7I3CYuM0.net
わざわざ「自己参照する構造体」という用語が与えられているのは構造体タグのスコープを
説明する文法解説上の都合じゃないかな。
ノードを直列に接続すればリストになったり複数の接続を持てば木になったりというデータ構造のことと、
他のノードへの接続には C ではポインタを使うのが自然だというふたつの事柄を併せると
結果的に自分自身 (を含む構造体) と同じ型のオブジェクトを指すポインタが現れることもあるというだけのことで、
(データ構造、また、その管理においては) 指している型が同じなのか違うのかで
ことさらに区別して考える意味はあまりないように思う。

75:デフォルトの名無しさん
21/07/22 16:44:22.00 zX6Mldkk0.net
C言語の勉強中にリスト構造とかの部分でポインタがよくわからない!って人良く見るけど
実際のところC言語で仕事するときにリストとか二分木ってあんま使わなくね?
構造体の配列は良く見るけど
組み込み系とかだとメモリ少しでも節約するためにリストにしたりするの?

76:デフォルトの名無しさん
21/07/22 16:55:22.66 MMqyZQ9/0.net
> 組み込み系とかだとメモリ少しでも節約するためにリストにしたりするの?
意味がよくわからんが
組み込みでもリストもmallocも普通に使うぞ
OSがなきゃmalloc使えんとでも思っているのか?

77:デフォルトの名無しさん
21/07/22 17:03:27.91 zX6Mldkk0.net
>>76
いや一般的にリソース制約の多い組み込み系だからこそmallocとリスト構造使って
本当に使う分だけメモリ確保するのかなと思ったんだけど
なんか気に触ったのならすみません

78:デフォルトの名無しさん
21/07/22 17:12:18.33 MMqyZQ9/0.net
> C言語で仕事するときにリストとか二分木ってあんま使わなくね?
気に障るってか、数秒えってなった

79:はちみつ餃子
21/07/22 17:27:11.52 r7I3CYuM0.net
>>75
ワイはプロではないし組み込みのこともよう知らんけど
言語処理系を作ったときに当然ながら構文木を組み立てたりはしたし、
宣言した名前を保存するハッシュテーブルはチェイン法を使ったのでリストの一種でもあるわな。
(今なら面倒くさいので C++ で書いてしまう (標準ライブラリのコンテナを使う) だろうけど。)
分野によるとは思うけど、リストや木がそんなにほとんど目にしないというほうが不自然な気がする。

80:デフォルトの名無しさん
21/07/22 17:58:20.48 4yFOTvD80.net
>>77
横からだけどマイコン次第だわな。メモリの動的確保なんて、
そもそも無理ーって処理系もある。コンパイル時にメモリは固定しちゃう。
昨今の32bitのARMマイコンやらESPやら最近触ってるけどmallocも普通にあるし、
サポートライブラリにlistのソース付いてたり(それを使うべきかは悩む)。
更にc++なんかも普通に使えるから、なんか落ち着かんw

81:デフォルトの名無しさん
21/07/22 21:02:00.87 NQdyjX4FM.net
簡単なテキストエディタ作ってみてください

82:デフォルトの名無しさん
21/07/23 00:04:27.67 efwzK8IKa.net
っsed

83:デフォルトの名無しさん
21/07/23 00:26:23.76 IkF8M4100.net
あれは簡単なのか?w
コマンド自由に操れる人、果たしているのかな?

84:デフォルトの名無しさん
21/07/23 06:51:28.40 U6L8J7vD0.net
作るのが簡単 ≠ 使うのが簡単

85:デフォルトの名無しさん
21/07/23 07:52:07.52 /J+0ROXX0.net
えー? sed禁止とか言われたら立ち直れんぞ

86:デフォルトの名無しさん
21/07/23 09:04:13.56 /WZbwRMt0.net
sed awkして(ry

87:デフォルトの名無しさん
21/07/23 09:41:53.92 lst4CtWH0.net
Screen EDitor ですねわかります

88:デフォルトの名無しさん
21/07/23 18:17:37.42 kuO5Sx1T0.net
よくUnixについての記事や書籍に,
「sedは入力全体を一度に読み込まず一行ごとに処理するから
動作が遅くならず,メモリ容量も気にしなくていい」
みたいなことが書いてあって,それは概ね事実だと思うんだけど,
C言語でsedを実装するときもviを実装するときに比べて
メモリ確保とかが楽なんだろうか。

89:デフォルトの名無しさん
21/07/23 19:24:45.90 Nx0yKcVz0.net
Ruby では、
IO.readlines は、ファイル内のすべてを読み込むが、
IO#each_line は、1行ずつ読み込む

90:デフォルトの名無しさん
21/07/23 19:49:44.19 IkF8M4100.net
sedにもホールドスペースがあるから、テキスト全体を読み込んで処理する事も出来る

91:デフォルトの名無しさん
21/07/23 23:06:00.86 kreL/CiTK.net
>>88
そらviよりは楽だろうが、Nコマンドとかで複数行抱える必要はあるし、そもそも数百万桁の行食わされるかもしれんし。
オリジナルsedは確か桁数制限あったよね?

92:デフォルトの名無しさん
21/07/24 00:40:19.89 osiAYP280.net
>>91
最新の標準Unixだとsedは最低8192バイトだけ読み込めばいいみたいよ。
URLリンク(pubs.opengroup.org)

93:デフォルトの名無しさん
21/07/24 01:03:44.23 3ie/V+ee0.net
POSIX標準は満たすべき最低レベルを規定しているって事ではないかな?
GNU sed の実装はこうみたいだ
For those who want to write portable sed scripts, be aware that some implementations have been known
to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The POSIX standard
specifies that conforming sed implementations shall support at least 8192 byte line lengths. GNU sed has
no built-in limit on line length; as long as it can malloc() more (virtual) memory, you can feed or construct
lines as long as you like.

94:62
21/07/26 12:30:48.85 yVSFJZsJ6.net
自己参照型構造体(用語法的に正しくないという指摘もあるけど…)がちょっとわかったかも。
はじめは『もう一度基礎からC言語』の第31回「データ構造(10)~構造体をポインタでつなぐ」
URLリンク(dev.grapecity.co.jp)
を参考にしてたんだけど,記事集の題名からも察せる通り「初めてC言語を学んでいる」
という状態で読むには向いていなかった。
図書館でそれっぽい本を漁って見つけた,
『C実践プログラミング』の17章「高度なポインタ」にある解説が
初学者としては一番わかりやすかった。
わざわざこのスレで報告する需要はないかもしれないけど,
将来に,おなじような概念の理解で詰まっているひとの
助けになるかもしれないからという言い訳でもって書き込ませてください。
--
C言語でデータ構造を作ろうと思ったら,
基本的にコンパイル時から大きさを決め打ちして用意せざる得ないけれど,
〝無から有を作り出せる〟[*1]malloc関数を用いることで
コンパイル時ではなく実行時に自由に拡大できるという,
記憶領域を食いにくいのに大規模な情報を格納できるデータ構造を作れる。
なぜ構造体を使うのかは自明すぎるためか書籍では明言されていなかった。
あえて言葉にするなら,
C言語において 複雑な情報を格納できるデータ構造を作るにあたって
「構造体を定義する」ことはもっとも一般的な慣行であることと,
C言語の演算子に自己参照型構造体の操作に非常に便利な演算子
構造体ポインタ演算子->が用意されているということが決め手なのかな。
*1: ちょっと違う気がするけど,書籍にはそう書いてあった。

95:デフォルトの名無しさん
21/07/26 14:20:07.95 9MzzzjGrF.net
URLリンク(dev.grapecity.co.jp)
観たけど余談が多過ぎてなかなか本題に入らずイライラするω
あと確かに初心者向けではない
入口にたどり着く前に挫折する文章の書き方だと思う

96:デフォルトの名無しさん
21/07/26 14:22:50.46 9MzzzjGrF.net
>『C実践プログラミング』の17章「高度なポインタ」にある解説が
君にとって判り易かったのかも知れないが
君の感想文を読むとあまり良い本ではなさそう

97:デフォルトの名無しさん
21/07/26 14:35:32.21 5u5J/MDS0.net
ama zon 4900900648
2冊目か3冊目に読む本
2005年6月21日に日本でレビュー済み
以前、某雑誌の特集で、Cがわかればすべてがわかるというのがあり
ましたが、まぁヨイショのし過ぎな文句なのかもしれませんが、依然
として、知っておいたほうがよい言語だと思います。
Cでプログラムするような機会は、ほんとここしばらく全くないです
けど、Cを勉強していたおかげで今までかなり助かってます。なんと
いってもCの影響を受けた言語は多いですからね、色々応用がきくも
のなのですよ。
で、肝心のこの本ですが、前訳本でも書きましたが、初心者を脱しよ
うとしている人にとっては最適だと思います。よくありがちな、Cの
文法やテクをただ書いているだけの本とは違います。プログラムのス
タイルやプログラムの仕方についての記述が数多くあります。
Cのような言語の場合、どのようにコーディングするのか、言い換え
るとWHATだけでなくHOWについて必ず考えなくてはならないと思いま
す。この本は常に、HOWについて意識した記述をしており、そういった
点が、この本を推奨する大きな理由です。
ただ、この本だけで、ポインタとかのキモはさすがに理解できません
でしたので、別の本を読む必要があります。

98:デフォルトの名無しさん
21/07/26 14:52:24.77 9wDqt6nuF.net
>>74
>(データ構造、また、その管理においては) 指している型が同じなのか違うのかで
>ことさらに区別して考える意味はあまりないように思う。
それ
>>94
>C言語の演算子に自己参照型構造体の操作に非常に便利な演算子
>構造体ポインタ演算子->が用意されているということが決め手なのかな。
まだ誤解してると思う

99:デフォルトの名無しさん
21/07/26 14:57:02.20 5u5J/MDS0.net
不充分。この本だけでは足りない。
2019年4月13日に日本でレビュー済み
敢えてこの本を買う意味が分からない。
20世紀に買ったが、この本だけでは解決できない問題があり、投げた。
よくある fgets & sscanf のコードの部分では、入力バッファのクリアを行う方法が書かれていなかった。
当時はインターネットのコンテンツが今ほど発達しておらず独学ではお手上げ。
他にも何か問題点があった気がするし、今や様々な解説サイト、また「よくある解説サイトの誤りを指摘するサイト」で足りる。
セキュリティ対策についても、wikipediaのサンプルコードやjpcertの「CERT セキュアコーディングスタンダード」など、今では豊富な資料がネットで入手できる。必要なら英文資料だってネットで容易に入手できる(もちろんC99の規格文書も)。

100:デフォルトの名無しさん
21/07/26 16:06:22.39 +kNv7glZa.net
諸々のコンパイラや環境がC11に準拠するようになって久しく、また業務やOSSでもC11で導入された新機能を使うようになってきてる印象があるんだけど(要出典w)、こと並列処理に関してはまだまだC99+POSIXスレッドを使ってた方が良さそうね。
久しぶりに並列処理を書いてみようと思ったんだけど、C11で標準規格として導入されたthread.hに対応してるコンパイラが現時点でも(特にUnix系で)ほとんどないことが意外だった。
今のところthread.hをUnixで使いたかったらmusl Cくらいしか選択肢がないし、
URLリンク(www.etalabs.net)
3年前の電子掲示板の書き込み(要は典拠性が低い)ではあるけど
URLリンク(www.reddit.com)
ほとんどの人がC11ではなくPOSIXが定めてるスレッド使ってるみたいだし。
せっかく汎OS的に並列処理がかけそうな規格なのに、もったいないというかなんというか。。。

101:ハノン
21/07/26 20:52:03.28 PhHFyA7M0.net
>>99
>入力バッファのクリアを行う方法
入力バッファのフラッシュは確か MS のコンパイラだけでしか使えない環境依存だったかと
行末に \n が在る、とかのルールがあれば、それが出るまで読み捨てればいいのですが、そういうルールがなければどうしようもない気が

102:ハノン
21/07/26 20:54:03.66 PhHFyA7M0.net
>>100
>せっかく汎OS的に並列処理がかけそうな規格
C11 は調べていませんが、C++ と比べてどうですか?私は C++11 以降でそういうのを書いています‥‥

103:はちみつ餃子
21/07/26 21:07:00.92 afAoM3cN0.net
>>100
C11 のスレッドはオプショナルなのでスレッドを提供しなくても C11 準拠を名乗れる。
C の立場からすれば標準ではあまり高レイヤな機能を要求するのは気が引けるだろうし、
かといっていまどきスレッドに全く触れないでいるというわけにもいかないという妥協なんじゃないかな。
C11 のスレッドの基本的なモデルは POSIX のスレッドとそんなに違いがない (名前が違う程度) ので、
かえって乗り換える強い動機にならないのかも。

104:62
21/07/26 22:30:44.17 sOMY1Y2o0.net
>>96
>>98
ご指摘ありがとうございます。
構造体リストについてもう一度 勉強しようと思います。
(他の方も書評の引用


105:などありがとうございます) 『C実践プログラミング』のAmazon書評にあった 『Cクイックリファレンス 第2版』というのを試しに読んでみたところ, かなり規格網羅的で丁寧だと感じたので, 当面はこれで勉強してみようと思います。 こちらの書籍には「 struct data { // some code... struct data *next } 」という形のコードの解説そのものはありませんが, ポインタの解説をCの規格に沿ってしてくれているので かなり良い教科書として使えそうです。 以後言い訳:: いまのところ,まだC言語の規格が全て頭に入っている状態ですらなく, ましてや実際のプログラミング作法も分かっていない段階なので, ある書籍を見たときの(現代における)正確性・信頼性の判断が できないんですよね……。 『C実践プログラミング』は昔のO'Reillyが出している書籍なので ある程度信頼できるかな,と思って読み進めていたんですが, (実際,本質を突いていて分かりやすいと感じる部分も多くありました) 時代的にも正味の内容的にも現代において参考にすべき 良書とはいいがたいのかな……?



106:デフォルトの名無しさん
21/07/27 05:25:18.45 x4yitIm80.net
ポインターで次へつないでいく、リストみたいな自己参照型。next pointer。
同じ構造体のリスト。
動的関数型のElixir は、片方向リストを使う
a → b → c → d
struct data {
struct data *next
}
これが両方向リストなら、struct data *prev も持たなければならない。
次・前の2方向へ、たどれなければならないから
a ←→ b ←→ c ←→ d
ポインターに、null を代入すれば、次・前は存在しない。
つまり、終端を表す
詳細は、アルゴリズム・データ構造を参照

107:デフォルトの名無しさん
21/07/27 10:57:27.91 cZjH0t2V0.net
>>98
いや確かに -> は自己参照する構造体を使うときに好都合だぞ
(*(*p).next).next が p->next->next で済むんだから

108:デフォルトの名無しさん
21/07/27 11:05:53.35 /ekQh9610.net
双方向で b を削除するのに
b->prev->next = b->next;
b->next->prev = b->prev;
b さよなら
これで済むからありがたい表記ではあるな

109:デフォルトの名無しさん
21/07/27 11:39:36.88 neQM5ma+0.net
>>107
あ、なる
良く出来てんな

110:デフォルトの名無しさん
21/07/27 11:42:04.93 sIvc9ZAG0.net
忘れずにちゃんと成仏させろよな

111:デフォルトの名無しさん
21/07/27 16:12:06.91 Dog97BpdF.net
>>106
屁理屈

112:デフォルトの名無しさん
21/07/27 17:25:02.44 cZjH0t2V0.net
>>110
異論があるなら堂々と言えよ
自分の意見が屁理屈かどうか見せずにそれを言うのは卑怯だぞ

113:デフォルトの名無しさん
21/07/27 18:25:54.21 Dog97BpdF.net
そもそも話がかみあってない
こっちは気付いてるけど
君は気付いていない
ただそれだけ
だから屁理屈

114:デフォルトの名無しさん
21/07/27 18:38:55.37 cZjH0t2V0.net
結局、自分は尻尾を見せないんだな
やりあう価値もないゴミだな、唾棄

115:デフォルトの名無しさん
21/07/27 18:52:50.94 S/tVMF6N0.net
自己参照型の構造体で固定段数のリンク手繰るのに便利にはなってるけど
自己参照型の構造体があるがゆえに -> ができたんじゃなく
単にポインタの指し先(構造体)のメンバを (*). じゃ遠回りなので直接指定したいがための存在だと思ってる

116:デフォルトの名無しさん
21/07/27 19:55:06.48 rlqI0SGsK.net
>>114
同意だが、.で共用出来なかったんかね?
関数と関数ポインタみたいな感じで、左辺がポインタだったら逆参照してからメンバアクセス。

117:はちみつ餃子
21/07/27 23:09:50.37 eiJldbv00.net
>>115
Rust ではそうしてるんだから C でも


118:最初からそういう選択も出来たはずではあると思う。 だけど違うことをするのに同じ見た目にするのが良いかどうかというのは微妙なところ。 どちらが良いと一概に言えるもんではないからな。



119:デフォルトの名無しさん
21/07/28 00:16:37.31 GYM2ckiMM.net
CはRustの派生だったのか、知らなかった

120:はちみつ餃子
21/07/28 00:34:49.35 0ASLy6H40.net
>>117
派生関係も時系列も前提にしてない。
別の選択をしたものが事実として存在するので可能であるのは疑いないと言ってる。

121:デフォルトの名無しさん
21/07/28 00:53:01.29 Fz30Fvzo0.net
FortranやCobolにも導入して欲しいのか?

122:デフォルトの名無しさん
21/07/28 01:00:09.40 nkHrLyVI0.net
うーん?
ある構文(範疇としては演算子の形態論?)について,
「他の言語での採用例があるからC言語がそういう構文を持っていても不思議じゃなかった」
という話が展開されていたと思うんですけど,
どうして「RustはCの派生」とかFortranやCOBOLの構文の話になったんですかね……?

123:デフォルトの名無しさん
21/07/28 01:46:29.97 LX2CDHAF0.net
バカだから

124:デフォルトの名無しさん
21/07/28 09:52:29.36 M/k1RjyqH.net
C99以降で真偽型をboolのように表記したいときは<stdbool.h>を読み込みますが,
規格票には「型boolはマクロとして定義しろ」とあります。
URLリンク(www.open-std.org)
一般に既存の型から新しい表記の型を定義するときはtypedefを使うべきだと
(典拠は失念したのですが)聞いたことがあります。
たしか,コンパイラによる検査があったりより構文的に厳密になったりするから,
というような理由だったはずです。
真偽型boolがtypedefではなくマクロで定義されている理由ってなんでしょうか。
思い当たる理由としては,C++との互換性がありますが,それをC言語の規格で考慮する意味がない
(というか,C++の規格をC側から参照すると循環的になってしまう気がする)
気がします…。
C規格の論理的根拠の真偽型にかんする節も読みましたが,
「typedefではなくマクロを使う理由」は記載されていませんでした。
URLリンク(www.open-std.org)

125:デフォルトの名無しさん
21/07/28 10:26:19.41 vTqcwKkg0.net
マクロだと#undefできるから自分でboolを定義してる古いコードのための移行措置っぽいね
<stdbool.h>をincludeしなければいいと思うけど間接的にincludeされるケースもあるんだろう
_Boolの方は予約語になってる
7.18 (4)
..., a program may undefine and perhaps then redefine the macros bool, true, and false.
プログラムはbool、true、falseマクロをundefineして再定義することができる
7.31.11 (1)
The ability to undefine and perhaps then redefine the macros bool, true, and false is an obsolescent
feature.
⇒ bool、true、falseをundefineして再定義できる特性は廃止されつつある

126:デフォルトの名無しさん
21/07/28 12:14:26.76 I0vZ6ZDJF.net
Win32APIとか使わずに
Cの標準関数でカレントディレクトリではなく
今実行中のexeのpathを得る方法はどれですか?

127:デフォルトの名無しさん
21/07/28 12:21:24.51 Zs50Z/m/0.net
int main(int argc, char* argv[])
の argv[0] で実行ファイルへのフルパスがえられるのは環境依存だったかな・・・

128:デフォルトの名無しさん
21/07/28 12:22:28.68 uGnpdH8xa.net
mainの第2引数の argv[0] にはコマンドラインから入力した通りのコマンド名が入っているんだっけ
フルパスで入っているんだっけ

129:デフォルトの名無しさん
21/07/28 12:24:05.30 uGnpdH8xa.net
被った
たしか Windows はフルパスだったような…
違ってたらごめんなさい

130:デフォルトの名無しさん
21/07/28 12:27:22.89 TLecxenIM.net
実装に依存

131:デフォルトの名無しさん
21/07/28 12:35:40.50 uGnpdH8xa.net
Windows という書き方はよくないかな
シェルの実装によると思います
なので、WSLに持っていくと期待通りに動かなかったりするかもしれません
ここでは Windows限定でよさそうだけど

132:デフォルトの名無しさん
21/07/28 13:20:46.92 6qacKWPx0.net
え?そう? Windows で C 使う人って今はあまりいないのでは? Linux とかなら分かるけど。

133:デフォルトの名無しさん
21/07/28 13:41:10.64 4VQYix970.net
powershellはフルパスだけどcmdは入力のまま
結局はCreateProcessに渡した文字列なのでフルパス前提にしちゃだめよ
OSに依存しない方法で確実なのはないよなぁ
argv[0]が
ファイル名のみ:カレント+環境変数pathを走査
相対パス:カレントと連結
絶対パス:そのまま
とかやればそこそこいけるだろうけどめんどくさいな

134:デフォルトの名無しさん
21/07/28 13:54:41.98 vTqcwKkg0.net
純粋なC標準の範囲では不可能な気がする
カレントディレクトリをとるgetcwd()もPOSIX(unistd.h)だし
C言語の標準ライブラリにはディレクトリ階層の概念自体がなさそう

135:デフォルトの名無しさん
21/07/28 13:55:33.60 uGnpdH8xa.net
>>131
powershell と cmd で違うのか…
なんでそうしたんだろ
何れにしても、けぅこう面倒なのね

136:デフォルトの名無しさん
21/07/28 14:05:55.87 I0vZ6ZDJF.net
みなさんありがとうございます
dirname(argv[0]) したら argv[0] が壊れました
ほんとうにがりがとうございました

137:蟻人間
21/07/28 14:19:05.25 JuarLz62d.net
本当のニガリが10、あったと?

138:デフォルトの名無しさん
21/07/28 14:21:25.34 tV9+c+Bb6.net
これ解決策じゃなくて愚痴なんだが、main()関数が使えるのはホスト環境で、つまりmain()関数のargv[]引数は「OSによる支援」を前提にできるんだから、実装依存じゃなくて「argv[0]には実行されたファイルのOSにおけるパス名が格納される」みたいな仕様にしてもよかった気がする。
それこそstdint.hみたいに、多種多様な機器への対応を考えなくてもいい関数なんだから、実行環境のファイルシステムやらをある程度は仮定しちゃってもいいわけで。

139:デフォルトの名無しさん
21/07/28 16:21:41.95 6qacKWPx0.net
ファイルシステムもOSもない組み込み機器もあるわけで・・・

140:はちみつ餃子
21/07/28 16:21:59.41 0ASLy6H40.net
>>136
どんな OS でも Unix 風のファイルシステムを採用しているというわけではなくて、
たとえば BTRON が採用しているファイルシステムでは
同名のファイルが存在してよく、ディレクトリのような階層化は存在しない。
全体で唯一に区別できる名前 (フルパスに相当するもの) がない。
OS だってファイルシステムだって多種多様なんで、
起動時に「なんらかの」文字列で情報が与えられるということ以上は
環境依存にならざるを得ないよ。

141:はちみつ餃子
21/07/28 16:25:16.04 0ASLy6H40.net
>>137
その場合は通常の main 関数からの起動にはならない (main に意味のある引数が渡されないか特別なスタートアップ経由で起動される)
ので、「main に値が渡されるならば」それなりの OS が仮定できるというのが >>136 の言ってることやで。

142:デフォルトの名無しさん
21/07/28 18:03:22.93 Y6SMxOTL0.net
>>139
すげぇ
たまには正しくわかりやすい説明できんじゃん
ちょっと見直した

143:デフォルトの名無しさん
21/07/28 18:21:15.71 S51yZazJ0.net
コード記述してて実行ファイルのフルパスが必要となるんだから
それなりのOSから叩き起こされてること前提よね

144:デフォルトの名無しさん
21/07/28 18:43:00.22 nkHrLyVI0.net
>>138
> BTRON が採用しているファイルシステムでは
> 同名のファイルが存在してよく、ディレクトリのような階層化は存在しない
知らんかった……。
調べたところBTRONは組込み機器向けのファームウェアじゃなさそうだし,
ホスト環境=「それなりのOSが期待できる」環境あっても,
「あるファイルのパス名が存在して,その絶対値が文字列として一意に定まる」
ことさえ期待できないのか……。

145:デフォルトの名無しさん
21/07/28 18:54:22.92 wp9dn28tK.net
>>134
dirname()は引数を破壊するのでコピーしてから渡すべし
今回のケースでは結局ダメだけどw

146:デフォルトの名無しさん
21/07/28 18:56:43.36 nkHrLyVI0.net
> [...] the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup.
URLリンク(www.open-std.org)
C2xでもargv[0]に何が格納されるかは「実装依存」って書いてあるね……めちゃくちゃ残念だ。
あとこれ読んでて気が付いたけど,「ホスト環境」ってhost environmentじゃないのね。
hosted enviromentだから,正確に訳すなら「ホスト済み環境」とかのほうが良いのかな?

147:デフォルトの名無しさん
21/07/28 22:12:53.76 vTqcwKkg0.net
そのhosted environmentはプログラムの実行環境(execution environments)を
・freestanding(自立した環境=OS無しの組み込み系)
・hosted(OSにhostされた環境)
に分けたものだからOSとかプラットフォームを指すホスト環境とはたぶん別の意味

148:デフォルトの名無しさん
21/07/30 19:40:44.58 ftRMaVHk0.net
hosted environmentの概念には明らかにUNIXが背景になってるね
MS-DOSだのCP/MだのROM BASICだのまでは想定してない

149:デフォルトの名無しさん
21/07/31 21:45:13.12 c1SsRmFt0.net
>>146
くわしくしりたいです。
「OSというのものは高性能である」という前提が
Unixとかでしか通用しなかったってことですか?

150:はちみつ餃子
21/08/01 11:25:29.19 grRzUWQ80.net
>>147
性能とかじゃなくてモデル化の仕方が多様という話。
たとえば古い時代の BASIC (N-BASIC など) は環境変数やコマンドラインという概念は持たないが、
違う形でデータを受け渡す方法は持っていて、どちらが高性能かというようなものではない。

151:デフォルトの名無しさん
21/08/01 18:29:17.83 1DStn3/B0.net
>>148
今 調べた知識なのでいろいろ間違っているとは思うのですが,
N-BASICとかってそもそも「OS」なんですかね……?
「hosted environmentという概念はUnixを想定したもので,
古いBASICでは通用しない」
という話からは,
1. Unixと古いBASICが同列の概念である
2. hosted environmentは「OSがある環境」を指している
ようなことが読み取れるんですが,
1. N-BASICはUnixのような
「機器→抽象化層1 (HAL/OS) →カーネル→シェル」
みたいな構造では表わせない位置にあるため
Unixと同列(あるいは類似)の概念として扱うのは
違うような気がすること
2. そもそもhosted environmentは
C2x規格の5.1.2.2で規定されている動作を実装した処理環境であって
「OSがある環境」を指してはいないこと
(だからUnixがどう,みたいな話は関係ない?)
URLリンク(www.open-std.org)
などから,ちょっと納得しがたいです……。

152:デフォルトの名無しさん
21/08/01 18:40:30.22 4Ph4Dvnc0.net
IPLで起動して、ハードウエアへのアクセスを代行し、
コマンドをタイプして結果を文字で表示するCUI
という観点からはUNIXとBASICは同列だよ
MS-DOSでのデバドラはお行儀でしかなく
アプリが直接I/Oなんて珍しくもなんともないが
一応argc, argvという概念はあった
言い出すとマイクロカーネルをヨイショする連中を嘲笑うように
モノリシックカーネルでいったLinuxは、じゃあOSに非ずなのかと
OSとは何か、何が該当し、何が該当しないのかは
見方が色々で誰もが認める基準はなかなかできない

153:デフォルトの名無しさん
21/08/01 19:45:48.16 bX2lzryL0.net
なんかわざと煽ろうとしている?

154:デフォルトの名無しさん
21/08/01 20:00:02.07 tSrdcQx/0.net
OSから外れた例をわざわざ挙げたのだろうと思っていたが、OSが何か分からない人でしたか...

155:はちみつ餃子
21/08/01 20:46:27.86 grRzUWQ80.net
>>149
> N-BASICとかってそもそも「OS」なんですかね……?
---------- JIS X 0001-1994 ----------
オペレーティングシステム, OS(省略形)
プログラムの実行を制御するソフトウェアであって,
資源割振り,スケジューリング,入出力制御,
データ管理などのサービスを提供するもの。
備考
オペレーティングシステムは,ソフトウェアが主体であるが,
部分的にハードウェア化することも可能である。
-------------------------------------
まあ要するに OS がどのような構成を持つものなのかというのは曖昧で、
Unix 的な立ち位置も OS が持ちうる構成のひとつでしかないんよ。
> Unixと同列(あるいは類似)の概念として扱うのは
> 違うような気がすること
「モデル化の仕方は多様」という例のひとつとして N-BASIC を出している。
違うように感じられるならそれは提示した意図通り。

156:デフォルトの名無しさん
21/08/01 20:59:26.94 6Hcq0V/AM.net
この人の理解が間違えている。
わざと言っているとしたら悪質

157:デフォルトの名無しさん
21/08/01 21:23:59.60 fSdDKS6o0.net
>>154
俺もわからん。
何がどう間違ってるのか説明しておくれ

158:デフォルトの名無しさん
21/08/01 21:37:13.51 dQpg7mz50.net
N-BASICは確かにハードウエアを直接制御できるという意味では
OSに近い。ただ今のOSとは全然違う。BASICだと遅すぎるので
大半はマシン語で直接書いてある。今のOSとは考え方が違う。

159:デフォルトの名無しさん
21/08/01 21:43:51.38 4Ph4Dvnc0.net
BASICそのものはマシン語で書かれているんだが

160:デフォルトの名無しさん
21/08/01 21:54:08.54 1DStn3/B0.net
>>156
たしかにそういう意味では「OS」といえるのかもしれないですね。
ただ,それだと組込み機器のファームウェアだって
機器を操作できる,対人インターフェースがあるという点ではOSといえることになりません?

161:デフォルトの名無しさん
21/08/01 21:58:23.19 4Ph4Dvnc0.net
なるね
何か困るの?

162:はちみつ餃子
21/08/01 22:05:54.64 grRzUWQ80.net
>>158
はっきりした基準はないという前提だけどぼんやりとした概念的な部分では
OS はアプリケーションソフトの対比的なものだと思う。
用途ごとのアプリケーションソフトを起動するという前提がないなら機能的に OS 相当のものを
含んでいても普通は OS とは言わないんじゃないかな。

163:デフォルトの名無しさん
21/08/01 23:18:55.12 bX2lzryL0.net
ホントにOSだと主張するなら、ぜひWindowsの仮想環境で動かしてみてくれ

164:デフォルトの名無しさん
21/08/02 00:18:03.59 AinH6UQa0.net
もしかして仮想マシンとエミュレータ混同してる?

165:デフォルトの名無しさん
21/08/02 00:39:04.73 5dFVW6Kq0.net
動かせないのなら、回りくどい事言わず、無理ですと言えば済むよ

166:デフォルトの名無しさん
21/08/02 01:06:43.81 AinH6UQa0.net
amd64で動くN-BASICがあるならできるんじゃない?
無いなら無理だわな

167:デフォルトの名無しさん
21/08/02 05:11:39.16 qOaSDvjS0.net
>>163
>>151

168:デフォルトの名無しさん
21/08/02 07:46:31.20 HO5h+jLQ0.net
最近はスマホのカメラ部品にTRON OS入ってるんだって?
もうBIOSやファームウェアもOSになるんじゃないかとも思っちゃう。

169:デフォルトの名無しさん
21/08/02 10:11:13.69 nmkqokJHF.net
>>152-153
BIOS: BI + OS
DOS: D + OS
OSとは

170:デフォルトの名無しさん
21/08/02 10:12:43.19 nmkqokJHF.net
>>154
>わざと言っているとしたら悪質
ほんそれ
最近そういう書き込みが多い
5chから人を減らす作戦だろう

171:デフォルトの名無しさん
21/08/02 11:03:41.91 qOaSDvjS0.net
>>167
> BIOS: BI + OS
ネタか?
Basic Input/Output System やぞ
> DOS: D + OS
こっちは合ってる

172:デフォルトの名無しさん
21/08/02 12:33:14.68 uwbNVnssM.net
>>169
もちろんネタと書いてあるのでネタなんでしょ。

173:デフォルトの名無しさん
21/08/02 13:13:02.28 y7YH8RaeF.net
Basic Interpreter OS

174:デフォルトの名無しさん
21/08/02 13:17:25.48 y7YH8RaeF.net
質問です
int flagA = 3 == 3;
int flagB = 3 == 3 == 3;
int flagC = 3 == 3 == 1;
の結果が
flagA : 1
flagB : 0
flagC : 1
になるのですが
flag B とか flag C は何が怒っているのでしょうか?

175:デフォルトの名無しさん
21/08/02 13:31:37.39 HO5h+jLQ0.net
>int flagB = 3 == 3 == 3;

int flagB = (3 == 3) == 3;

int flagB = (1) == 3;

int flagB = 0;
>int flagC = 3 == 3 == 1;

int flagC = (3 == 3) == 1;

int flagC = ( 1 ) == 1;

int flagC = 1;

176:デフォルトの名無しさん
21/08/02 13:31:42.08 y7YH8RaeF.net
int flagD = 3 != 3;
int flagE = 3 != 3 == 0;
int flagF = 3 != 3 == 1;
flagD : 0
flagE : 1
flagF : 0
になります

177:デフォルトの名無しさん
21/08/02 13:31:46.39 59KH06XU0.net
タイホするっ!! ダーン ダーン
int flagB =
ここまでと
3 == 3 == 3
が別のパーツになっていて
== は左から結合するので
(3 == 3) == 3 となり真は1になるので
1 == 3 で偽すなわち0だ

178:デフォルトの名無しさん
21/08/02 13:41:18.14 y7YH8RaeF.net
解決しました
ありがとうございました

179:デフォルトの名無しさん
21/08/02 16:38:34.45 qdvnGLBb0.net
俺が怒っている

180:デフォルトの名無しさん
21/08/02 19:33:02.95 YziYRSV70.net
演算子の優先順位って覚えるのヤダー。自分書くと括弧だらけだわ。
どの辺が塩梅なんかねー?明示的でないと駄目よってコーディングとかもあるし。

181:デフォルトの名無しさん
21/08/02 19:49:19.60 5dFVW6Kq0.net
それでいいよ

182:デフォルトの名無しさん
21/08/02 20:03:46.84 Uu01rKAP0.net
& ^ | なんかのビット演算が比較よか低いのが微妙に嫌

183:デフォルトの名無しさん
21/08/03 09:51:48.02 wbx4PwZT0.net
憶える気のない者は成長しない

184:デフォルトの名無しさん
21/08/03 10:01:19.19 Z1msEN+ba.net
結合の優先度は、自分が分かっていても
記憶があやふやな人が不安になるといけないから
結局カッコを明示的に描くかな…

185:デフォルトの名無しさん
21/08/03 10:17:52.20 wbx4PwZT0.net
中学のマイコン部かよ

186:デフォルトの名無しさん
21/08/03 13:41:40.87 34OfFMxOr.net
>>181
覚える気があっても、覚えさせられる気がしねー。

187:デフォルトの名無しさん
21/08/03 13:45:58.11 wbx4PwZT0.net
自分を磨くのは本人なので
そんなお節介は考えなくていい

188:デフォルトの名無しさん
21/08/03 14:20:08.34 kdIV+1e00.net
CでC++の純粋仮想関数のような事をやりたいのですができますか? 疑似インターフェースです。

189:デフォルトの名無しさん
21/08/03 14:30:35.30 wbx4PwZT0.net
typedef struct iunknown iunknown;
struct vtable
{
int (*query_interface)(iunknown*, int, void**);
int (*add_ref)(iunknown*);
int (*release)(iunknown*);
};
struct iunknown
{
long count;
vtable* vtbl;
};
みたいなことか?

190:デフォルトの名無しさん
21/08/03 14:31:17.98 wbx4PwZT0.net
あ、いかんvtableのtypedef忘れたけどまあ許せやw

191:デフォルトの名無しさん
21/08/03 14:32:38.22 lGpJxUYy0.net
のような事の解釈余地に幅がありすぎ

192:デフォルトの名無しさん
21/08/03 19:27:01.81 I3gKaej4M.net
幅があると言うなら狭めるようなヒント書けばいいだけ
たたき台として>>187はそれほど悪くないと思う

193:デフォルトの名無しさん
21/08/03 20:41:05.50 kdIV+1e00.net
>>187
スゴーイ 感謝感激 ありがとうございます。
typedef struct {
void (*interface_a)();
void (*interface_b();
,
.
} TINTERFACEXXX;
typedef struct {
TINTERFACE ia;
} TOBJA;
なんてリレーションスタイルも考えたんですが、
いずれにしろ、クリーンアーキテクチャーのCでのSOLID原則ができるというところまでこぎつけました。
ありがとうございます。

194:デフォルトの名無しさん
21/08/03 23:48:19.32 Ucc8C21f0.net
COM最強

195:デフォルトの名無しさん
21/08/05 14:10:06.71 9IiPo8vtH.net
奥村晴彦 『改訂新版 C言語による標準アルゴリズム事典』の
「改訂新版 序」に、
> 現代の慣習に従って、[…] EXIT_SUCCESSを0にしたりした
とあるのですが、EXIT_SUCCESSマクロ変数を使った方が
定数即値を決め打ちするよりも可搬的であり、
それこそ「現代の慣習」であるように思うのですが、
実際はEXIT_SUCCESSより0を使う方が「現代的」なんですかね。
なお、誤植も疑ったのですが、集録されている実際のコードにおいても
return 0;と書かれていました。

196:デフォルトの名無しさん
21/08/05 14:30:14.22 O0DzK1TA0.net
>>193
0以外 は1以上も-1以下もあるし、下手すりゃ数値以外の可能性すらあるけど
0 は絶対0なので、少なくともこれに関してだけは
私は許そう

197:デフォルトの名無しさん
21/08/05 15:00:49.33 9IiPo8vtH.net
>>194
なるほど、「0 は絶対0なので」というので納得できました。
ありがとうございます。

198:はちみつ餃子
21/08/05 15:20:09.93 igzlcjJl0.net
>>193
思想的にはともかく、その件については習慣として定着してるという事実があるんで、
事実に逆らってもしょうがない。
ちなみに main 関数だけは return 文を通過せずに } に到達した場合には
return 0; と同じになるという仕様になってるんで、 return 文自体を省略するという
スタイルもある。

199:デフォルトの名無しさん
21/08/05 16:18:55.16 TenuDSkO0.net
>>193
mainの出口は仕方ないんだよ
enumなんて考え方ができる遙か前に決まったことで今さら変えられないというのが現実だ
mainの第2引数だって今ならconst付けそうなところだけど
これまたconstなんかなかった頃に決まったことだ

200:デフォルトの名無しさん
21/08/05 17:17:51.97 lrEA3gELa.net
>>197
歴史的にはそうなのかもしれないけど、それだと「EXIT_SUCCESSを0に」することが「現代の慣習」であることの説明になってなくないような
なんでEXIT_SUCCESSと書いてたのを0と書くようにしたのかが知りたいんでは
もう納得してるみたいなんでアレだけども

201:デフォルトの名無しさん
21/08/05 17:57:00.56 TenuDSkO0.net
enumつったんだけど
話通じてねえな

202:デフォルトの名無しさん
21/08/05 18:23:46.65 sS7OglMj0.net
マジックナンバーなんて駄目でしよってノリでEXIT_SUCCESSを使ってたけどあまり流行らなかったから0に戻したってことじゃないの?

203:デフォルトの名無しさん
21/08/05 18:25:20.09 sS7OglMj0.net
>>199
マクロ (#define) の話だからenum関係ないよ

204:デフォルトの名無しさん
21/08/05 18:36:03.13 C1udim1A0.net
C言語7不思議
enum { A=1 } main(void) { return A; }
このコードは合法か否か?

205:デフォルトの名無しさん
21/08/05 18:54:07.04 nywX30PRM.net
法なんてない

206:デフォルトの名無しさん
21/08/05 20:40:48.16 TenuDSkO0.net
>>200
だね
じゃあEXIT_SUCCESSはマジックナンバーないのかって

207:デフォルトの名無しさん
21/08/05 21:00:13.63 RBdzanHxM.net
オレのばっちゃが決めたんだ

208:デフォルトの名無しさん
21/08/05 21:12:45.92 sS7OglMj0.net
>>204
マジックナンバーって何かわかってる?
ググってからでないとenumみたいに頓珍漢なこと言って恥かくよ?

209:デフォルトの名無しさん
21/08/05 22:30:22.56 TWSeb4Gn0.net
横だけどeasing関数でマジックナンバーっての見たけど、結局何だったのかわからないままですわ

210:デフォルトの名無しさん
21/08/05 22:33:51.51 RyeVbM3/0.net
線形合同法で作る乱数に出てくる謎定数

211:はちみつ餃子
21/08/06 00:25:46.52 xkvwFph10.net
>>202
基本的には否だが、許容される場合はありうる。
main の型は以下のいずれか。
① int main(void);
② int main(int argc, char * argv[]);
③ 以上の二つのいずれかと等価 †1
④ 以上の三つのいずれでもない処理系定義の方法
それとは別に
「main関数の返却値の型がintと適合しない場合,ホスト環境に戻される終了状態は,未規定とする。」†2
とするという文言もある。
C で言う「未規定」というのは処理系が挙動を選択して良いことを意味するので、
適合しなくても適合したときと同等の処理になるように実装している処理系はあるかもしれない。
enum で定義した型 (列挙型) は
「char,符号付き整数型又は符号無し整数型と適合する型とする。型の選択は,処理系定義とする」 †3
とあり、列挙型が int と適合する可能性はある。
また、上述の④として処理系が main の返却値の型が列挙型であったときを許容するような定義をしているかもしれない。
-------------------------
†1 typedef やマクロによる別名、あるいは型調整などで同等になるものという意味
†2 「適合」に関する規則は複雑なのでここでは説明しない
†3 個別の列挙型ごとに選択してよい

212:デフォルトの名無しさん
21/08/06 07:01:45.65 QgUKHcUo0.net
>>206
おまえさんこそ何かわかってなさそうだな
なぜ、その値なのか由来が不明な定数は
スペルが0であろうがEXIT_SUCCESSであろうが
0x00であろうが本質的に同じことだぞ
UNIXを背景とせずにreturn 0;が説明できるか?
おまえさんみたいにググって拾った情報を丸呑みしてると
わかってないやつの間違った理解が伝搬するだけだぜ

213:デフォルトの名無しさん
21/08/06 08:15:51.79 3zvDecHz0.net
>>210
EXIT_SUCCESSがどういう意味かもわからないなら英語からやり直せよw
値の話じゃないことぐらい理解しろ
非常に稀な例としてEXIT_SUCCESSが0でないシステムが存在する
例えばOpenVMSでは
EXIT_SUCCESS = 1
EXIT_FAILURE = 2
だったりする
URLリンク(fafner.dyndns.org)
なのでそういうシステムへの移植を考えてるなら意味はあるけどそんな人はほとんどいないからreturn 0;でいいやんって話
そもそもunixでも0, 1以外の値を返すコマンドは多数あってその場合は自分でEXIT_xxxを定義する必要あるから0, 1だけ定義されててもねぇって感じもあるし

214:デフォルトの名無しさん
21/08/06 08:30:30.04 QgUKHcUo0.net
>>211
おまえさんは>>193が英語の話だと思っていたのかw
0がどういう意味かもわからないならCをやり直せよ

215:はちみつ餃子
21/08/06 09:12:19.75 xkvwFph10.net
>>211
関係ない。 言語仕様としては 0 が成功を表すというのは保証された動作で、
もしもホスト環境の都合と食い違うならランタイムサポート (スタートアップルーチン) で補正すべきこと。
EXIT_SUCCESS 「も」成功を意味する値として使えるというのとは独立した話。

216:デフォルトの名無しさん
21/08/06 09:17:08.98 3zvDecHz0.net
>>212
まじでマジックナンバー知らんのか?
0じゃ何を意味するかわからんから名前をつけるって話だぞ
EXIT_SUCCESSが英語だから英語の勉強しろって言ってるだけ
日本語使える環境なら
 正常終了 = 0
でもいい
で、>>193の件はそうは言っても正常終了で0以外なんてまずないし、たいていの人はmain()が0を返したら正常終了ってわかるからreturn 0;でいいやってなってるだけ

217:デフォルトの名無しさん
21/08/06 09:19:10.68 3zvDecHz0.net
>>213
> 関係ない。 言語仕様としては 0 が成功を表すというのは保証された動作
どこで規定されてるのか示してみ
そもそもOpenVMSの処理系は規格違反とでも言うのかよw

218:デフォルトの名無しさん
21/08/06 09:19:24.86 9vf9CEgT0.net
>>214
ほかはともかく、 0 だけはマジックではなく明確に意味を共通で持たせている
という話なのでは?

219:デフォルトの名無しさん
21/08/06 09:26:12.98 9vf9CEgT0.net
>>215
mainの戻り値がデフォルトで正常なときは 0 なのは言語仕様に規定されてるね
0又はEXIT_SUCCESSの場合,成功終了
この「又は」はほんとにORなので、EXIT_SUCCESS=1 のときは 0でも1でも正常よ

220:はちみつ餃子
21/08/06 09:44:11.58 xkvwFph10.net
>>215
繰り返すが EXIT_SUCCESS 「も」成功を表すことは保証されている。
それとは関係なく 0 が成功なのは保証された動作
以下は C99 からの抜粋 (日本語は JIS から対応箇所を抜粋)
5.1.2.2.3 Program termination
If the return type of the main function is a type compatible with int,areturn from the
initial call to the main function is equivalent to calling the exit function with the value
returned by the main function as its argument
main関数の返却値の型がintと適合する場合,main関数の最初の呼出しからの復帰は,
main関数が返す値を実引数としてもつexit関数の呼出しと等価とする
7.20.4.3 7.20.4.3 The exit function
If the value of status is zero or
EXIT_SUCCESS, an implementation-defined form of the status successful termination is
returned. If the value of status is EXIT_FAILURE, an implementation-defined form
of the status unsuccessful termination is returned. Otherwise the status returned is
implementation-defined.
statusの値が0又はEXIT?SUCCESSの場合,成功終了(successful termination)状態を処理系定義の形式で返す。
statusの値がEXIT?FAILUREの場合,失敗終了(unsuccessful termination)状態を処理系定義の形式で返す。
それ以外の場合,返される状態は処理系定義とする。

221:デフォルトの名無しさん
21/08/06 10:06:15.17 QgUKHcUo0.net
>>214
#define AHO_NO_3zvDecHz0 0
int main(void)
{
return AHO_NO_3zvDecHz0;
}
こう書いてもなぜ0なのかはわからない
マジックナンバーとはこういうことだぞ
extern int svc_get_success_code();
int main(void)
{
return svc_get_success_code();
}
こういうのと違うからな

222:デフォルトの名無しさん
21/08/06 10:38:06.15 3zvDecHz0.net
>>216
ほとんどの環境で 0 を正常と解釈できるからマジックナンバー扱いでなくてもいいだろって言う判断を奥村晴彦氏がしたってだけの話だと思う
>>217
途中でreturnせずにmain()の最後まで到達したら0を返す(これは言語仕様)という話と返された0が正常終了とみなすかどうかは別の話
> 0又はEXIT_SUCCESSの場合,成功終了
と主張するなら規格のどこで規定されてるのか書いてくれ

223:デフォルトの名無しさん
21/08/06 10:53:05.07 QgUKHcUo0.net
5.1.2.2.3 プログラム終了処理
 main 関数の返却値の型がint と適合する場合,main 関数の最初の呼出しからの復帰は,main 関数が返す値を実引数としてもつexit 関数の呼出しと等価とする。main 関数を終了する}に到達した場合,main 関数は,値0 を返す。
7.20 一般ユーティリティ<stdlib.h>
EXIT_FAILURE
及び
EXIT_SUCCESS
は,整数定数式に展開され,それぞれホスト環境に失敗終了状態又は成功終了状態を返すために,exit関数の実引数として使用することができる。

224:デフォルトの名無しさん
21/08/06 11:01:20.62 3zvDecHz0.net
>>217-218
すまん今規格見たら確かに書いてあったわ
OpenVMSとかは処理系で変換してるんだろうな
>>219
それは単にアホが意味不明な名前付けしてるだけ
そんなレベル低い話はチラ裏にでも書いとけ

225:デフォルトの名無しさん
21/08/06 11:25:57.87 QgUKHcUo0.net
>>222
スペルを変えるだけでは無駄ってことだよ
どこから出てきたのか、何から導いたのかが示されていなければ同じことだ

226:デフォルトの名無しさん
21/08/06 11:59:37.28 GGzcYLSBM.net
>>223
何わけわからんこと言ってるんだよ
EXIT_SUCCESS がわからないならプログラマ辞めちまえよw

227:デフォルトの名無しさん
21/08/06 12:04:06.56 QgUKHcUo0.net
は? EXIT_SUCCESSの意味を英語で理解しろとか言ってきたのおまえさんだぜ
NO_PROBLEMなんてオレオレマクロでもおまえさんは満足なんだろ
どうりで規格票もロクに読まねえわけだ
プログラマ辞めちまえをそのまま返すぜドスカタン

228:デフォルトの名無しさん
21/08/06 13:43:09.92 3zvDecHz0.net
> は? EXIT_SUCCESSの意味を英語で理解しろとか言ってきたのおまえさんだぜ
EXITもSUCCESSも英語だから英語「を」理解しろって言ってるんだが?
英語の前にお前は日本語を理解できるようになならないと駄目だなw

229:デフォルトの名無しさん
21/08/06 14:26:52.67 QgUKHcUo0.net
知らねえやつがまずいない英単語でドヤってて恥ずかしくねえの? ちょっと神経わからんなw
Cを使う以上はISO/IEC 9899に書かれていることが前提だからこそEXIT_SUCCESSというスペルの意味を知っているべきだが
おまえさんが露呈したアレこそがプログラマにあるまじき姿だろうがよ

230:デフォルトの名無しさん
21/08/06 14:34:50.29 KBiduyaj0.net
シェルスクリプトスレの名物キチガイコンビみたいだなお前ら

231:デフォルトの名無しさん
21/08/06 15:10:51.95 3zvDecHz0.net
>>227
> 知らねえやつがまずいない英単語でドヤってて恥ずかしくねえの?
どこを見たらドヤッてるように見えるんだよ…
> ちょっと神経わからんなw
そもそもドヤるという神経がわからんわw

232:デフォルトの名無しさん
21/08/06 15:15:17.60 QgUKHcUo0.net
>>229
どこを見るってPCのモニタだがw
1たす1は2なんだぞ~ぼくすごいだろ~みたいなお気の毒な姿

233:デフォルトの名無しさん
21/08/06 15:23:31.43 QgUKHcUo0.net
規格票は英語で書かれているわけだが
読んでないのは誰かさんだったね(プークスクス

234:デフォルトの名無しさん
21/08/06 15:34:06.02 3zvDecHz0.net
>>230
> どこを見るってPCのモニタだがw
わー、おもしろい
これで満足かな?w

235:デフォルトの名無しさん
21/08/06 15:37:08.92 QgUKHcUo0.net
スルーすれば逃げられると思っているようなのでもう一度言ってやる
Cを使う以上はISO/IEC 9899に書かれていることが前提だからこそEXIT_SUCCESSというスペルの意味を知っているべきだが
おまえさんが露呈したアレこそがプログラマにあるまじき姿だろうがよ

236:デフォルトの名無しさん
21/08/06 17:07:54.01 3zvDecHz0.net
露呈したのはEXITやSUCCESSでドヤられたとか思うお前のレベルだろw

237:ハノン
21/08/06 19:16:51.91 .net
なんだか香ばしいですね‥‥
>>218
完璧な回答ですね‥‥

238:デフォルトの名無しさん
21/08/06 20:02:31.35 CzNdrnJF0.net
main以外の関数だと、成功失敗の値は特に決められてはいないんですよね?

239:デフォルトの名無しさん
21/08/06 20:47:42.91 y8oe7xdW0.net
>>236
うん、決められてないよ
まあユーザ的には0を成功としておけばいい雰囲気だけど
システムコールに近づくとだいたい0が失敗になってくよね
0っつーかぬるぽっつーか

240:デフォルトの名無しさん
21/08/06 20:49:05.43 +/iE6x4C0.net
(s)scanf() の戻りは渡った非引数への変換に成功した数ですし ケースバイケースですわね

241:デフォルトの名無しさん
21/08/06 20:49:34.62 +/iE6x4C0.net
s/非/被/

242:はちみつ餃子
21/08/07 00:16:24.99 YBZ7G4A60.net
>>236
規定はないけどある程度の習慣はあって、おおざっぱにまとめると
・関数が受け持つ機能が副作用であり、
 返却値は成功or失敗のみを通知すればよいときは 0 を成功値とする
・関数が意味のある値を返すときはありうる値の範囲ではない値を失敗値とする
 (0、ヌルポインタ、負数、無限、NaNなど)
・入力値 (関数の引数) が正しい限り失敗がないことを見込めるときは
 不正な入力があった場合を未定義とする
 (呼出し前にチェックされているか、ロジック上正しいことをプログラマが保証することを期待する)
という感じだと思う。
あくまでも標準ライブラリやそれを踏襲した習慣をまとめるとこんな感じだろうという私なりのまとめなので
常に正しい選択というわけではないということはことわっておくが、
標準ライブラリを全く使わないようなプログラムもないだろうし
標準ライブラリを真似ておけば全体として一貫性が出て綺麗なんじゃないかな。

243:デフォルトの名無しさん
21/08/07 00:29:33.44 rXkekRAR0.net
strcmp

244:はちみつ餃子
21/08/07 00:54:21.18 YBZ7G4A60.net
strcmp は失敗しない。

245:デフォルトの名無しさん
21/08/07 06:09:45.55 ZNSsPCBy0.net
>>234
それでexitやsuccessの意味を知らないと証明したつもりになっているアホを
じゃあドヤる以外のどんな表現をすればいいんだ?

246:ハノン
21/08/07 08:46:51.55 .net
>>240
cctypes

247:デフォルトの名無しさん
21/08/07 09:05:40.63 AEz+LKNR0.net
>>243
> それでexitやsuccessの意味を知らないと証明した
どこからそんなアホなことを言い出したんだ?
またPC画面からかな?w

248:デフォルトの名無しさん
21/08/07 09:15:42.75 xdlB1E9b0.net
exitなんかで終わらしちゃダメでしょ
returnで終わらせないと

249:はちみつ餃子
21/08/07 09:50:33.76 YBZ7G4A60.net
>>244
文字判定系の関数に失敗はない。

250:デフォルトの名無しさん
21/08/07 11:27:30.28 sspluaGX0.net
exit は どこでもドアで便利

251:デフォルトの名無しさん
21/08/07 17:43:31.00 efxonHum0.net
どこから終わっても良いのか?それとも出口は一つにすべきか?

252:ハノン
21/08/07 18:13:40.12 .net
>>249
どこからでも return してよいのか?それとも return 文の記述は一箇所に限定するべきか?

253:デフォルトの名無しさん
21/08/07 18:18:29.86 sspluaGX0.net
一つの関数内でreturnは一つにするというコーディング規約があったときは
gotoの使用が増えてましたっけ

254:デフォルトの名無しさん
21/08/07 18:31:09.62 efxonHum0.net
Cなので仕方がないな。他の言語のように例外処理が try ... catch とかで使えれば gogo なくしても見易く書けるだろうけど。

255:デフォルトの名無しさん
21/08/07 18:35:47.91 HEQEjPMP0.net
出口を1つにしたほうが達成感がある
だがreturnお前はだめだ

256:デフォルトの名無しさん
21/08/07 18:36:21.14 efxonHum0.net
goto なしでやる方法は色々あるが、30年ぐらい前に何も参考にせずに俺が考えついたのは for (;;) のブロックに入れて途中で条件により break する方式。

257:デフォルトの名無しさん
21/08/07 18:44:02.64 608OSAzY0.net
無限ループって怖くね?

258:デフォルトの名無しさん
21/08/07 18:54:15.41 vvCAvRb50.net
実利の無いこだわりはやめていただきたく……

259:デフォルトの名無しさん
21/08/07 18:54:27.54 efxonHum0.net
>>255
最後のbreakを忘れたらそうなるのでそれだけは注意が必要

260:デフォルトの名無しさん
21/08/07 18:58:54.78 efxonHum0.net
ま、しかし、今はそういう例外処理的なやつは躊躇せずにgoto使うけどね。そうしないと見づらいし分かり難くなるから。

261:デフォルトの名無しさん
21/08/07 19:27:07.82 HEQEjPMP0.net
gotoを上手く使えないのは自制心がないやつだけだ
俺みたいに自制心のある人間はgotoとはマブダチになれる

262:デフォルトの名無しさん
21/08/07 20:03:57.86 AEz+LKNR0.net
>>258
に一票

263:デフォルトの名無しさん
21/08/07 20:13:31.71 sspluaGX0.net
フルメタルジャケット思い出したw

264:デフォルトの名無しさん
21/08/07 21:20:33.45 ZNSsPCBy0.net
>>245
あ、じゃあ違うんだな?
> EXIT_SUCCESSがどういう意味かもわからないなら英語からやり直せよw
規格票もロクに読まないからEXIT_SUCCESSがどういう意味かわからんやつが
英語がどうたら言うのは確たる根拠もなく言ってた戯れ言てことだな
PC画面に映ってるアフォはオモロイなwww

265:デフォルトの名無しさん
21/08/07 21:41:58.88 AEz+LKNR0.net
まずマジックナンバーの話なのか規格の話なのかはっきりさせようか…
あと「〇〇がわからないなら□□しろ」と言うのは「〇〇がわからない」と言ってる訳じゃないぞw

266:デフォルトの名無しさん
21/08/08 05:41:26.37 X9nZYb130.net
つまり出鱈目な前提で寝言ぬかしてるってことか

267:デフォルトの名無しさん
21/08/08 06:43:20.13 3G5PI5Y70.net
仮定法も知らないアホかよw

268:デフォルトの名無しさん
21/08/08 07:32:57.11 X9nZYb130.net
根拠なし、前提は出鱈目
恥を知れよまずは

269:デフォルトの名無しさん
21/08/08 09:53:42.66 766a9h8SM.net
仮定法を理解できなかったのか…
可哀想にw

270:デフォルトの名無しさん
21/08/08 10:19:43.20 X9nZYb130.net
証明も承認もされていない前提で何かぬかして
それを肯定して欲しがるのは二重質問だろアフォ

271:デフォルトの名無しさん
21/08/08 10:55:03.30 3G5PI5Y70.net
証明とか承認とか、仮定法に全く関係なくて笑える
肯定とかに至っては全く意味不明w

272:デフォルトの名無しさん
21/08/08 10:56:31.55 X9nZYb130.net
前提を間違ってるのをどんなに言い訳しても無駄だよ
         ,,-―--、
        |:::::::::::::;;;ノ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        |::::::::::( 」 <仮定法仮定法仮定法仮定法・・・・
        ノノノ ヽ_l   \______________
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |

273:デフォルトの名無しさん
21/08/08 10:58:09.47 o6Sz00kX0.net
いい加減にしろキチガイコンビ
もう3日目だぞ

274:デフォルトの名無しさん
21/08/08 11:40:04.29 3G5PI5Y70.net
なんの前提も置いてないのに前提が間違ってると言い続けるしかないポンコツBOT並みの知能だからねぇw

275:デフォルトの名無しさん
21/08/08 11:45:29.53 X9nZYb130.net
> EXIT_SUCCESSがどういう意味かもわからないなら英語からやり直せよw
前提: EXIT_SUCCESSがどういう意味かわからない
主張: 英語からやり直せ
該当者がいないんだが
あ、1人いたな規格票読まねえやつがw

276:デフォルトの名無しさん
21/08/08 12:51:11.36 aqugezwJ0.net
>>257
for (;;) するくらいなら do {} while (0); 選ぶかな

277:デフォルトの名無しさん
21/08/08 12:53:24.15 3G5PI5Y70.net
こんなのもわかんねーなら会社辞めちまえまえ!
って言われて会社辞めるアホやな
まあ辞めた方が会社にも本人にも良さそうだけどw

278:デフォルトの名無しさん
21/08/08 12:56:23.19 3G5PI5Y70.net
>>274
同意
無限ループは for(;;)
途中脱出は do {} while(0) を使うな

279:デフォルトの名無しさん
21/08/08 13:34:46.83 yE7YGXiy0.net
なるほどね
do{}while(0)ね

280:デフォルトの名無しさん
21/08/08 13:38:12.62 EooHPpNB0.net
while (1) は、たまに使います

281:ハノン
21/08/08 14:30:57.58 .net
>>278
for(;;)
ウォーニングが出ないからこちらを好みます

282:デフォルトの名無しさん
21/08/08 14:44:42.99 Cdmlpdjr0.net
while(1)だとどのツールでどういう警告が出る?

283:デフォルトの名無しさん
21/08/08 14:55:49.48 3G5PI5Y70.net
>>280
URLリンク(docs.microsoft.com)
最近(でもないか)の奴はwhile(1)だと警告を出さないようにしてるみたいだけど

284:デフォルトの名無しさん
21/08/08 15:21:56.83 ubSlJzPI0.net
Warningって読み方ウォーニング?
ワーニングじゃないの?

285:ハノン
21/08/08 15:24:23.58 .net
>>282
Star Wars
×スターワーズ
◎スターウォーズ
って覚えてね

286:デフォルトの名無しさん
21/08/08 15:41:10.34 EooHPpNB0.net
>>280
cl -W4 while.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
while.c
while.c(5) : warning C4127: 条件式が定数です。

287:ハノン
21/08/08 15:56:39.95 .net
>>280,281
うーん、手元の cygwin gcc 10.2.0 では while (1) も while (42) もウォーニングは出ませんね、コメントありがとうございます‥‥昭和は遠くなりにけり

288:デフォルトの名無しさん
21/08/08 22:32:52.55 19kZVfwv0.net
>>282
アメリカ人だと ゥワーニン って言ってた
インド人(会話は英語)は ウォニング ってグまではっきり言ってた
こっちから言うときは片仮名で「ワーニング」って言っても余裕で通じた
まあエンジニアどうしで通じりゃ適当でいいんだよ

289:はちみつ餃子
21/08/09 00:46:08.57 OWI9S7jW0.net
>>282
グーグル翻訳に発音させてみたらどちらともつかぬ半端な発音に聞こえる。

290:デフォルトの名無しさん
21/08/09 07:13:46.14 eF2Q2UUf0.net
>>279
つーかマジックナンバーがないのが魅力
# 組み込みでは無限ループがないほうが珍しい

291:デフォルトの名無しさん
21/08/09 11:00:51.25 5Oj13b1Xd.net
for(;;) はforeverと読む(俺定義)

292:デフォルトの名無しさん
21/08/09 11:51:07.90 Lb8CQXvk0.net
>282
「ア」と「オ」の発音の違いは曖昧。
…というのをトリビアの泉でやってた。

293:デフォルトの名無しさん
21/08/09 12:03:01.28 eF2Q2UUf0.net
アに近い←米語
オに近い←英語

294:デフォルトの名無しさん
21/08/09 12:40:56.75 GX8oEfXz0.net
ウォーニング
と発音した方が通じやすいけどな

295:デフォルトの名無しさん
21/08/09 12:42:49.10 78aLRiJY0.net
while( 条件式 )
そもそも条件式には、実質的なブール値・真偽値しか使えない。
MI


296:SRA-C 違反



297:デフォルトの名無しさん
21/08/09 13:25:39.38 c/YgMY770.net
これ最初に間違えた奴誰?

298:デフォルトの名無しさん
21/08/09 13:41:09.70 eF2Q2UUf0.net
whileの括弧の中は制御式な
== と != は等価式
不等号は関係式
条件式はいわゆる三項演算子だぞ

299:デフォルトの名無しさん
21/08/09 13:54:46.12 Hd/9N5qL0.net
参考までに

300:デフォルトの名無しさん
21/08/09 14:03:11.33 c/YgMY770.net
>>295
等価式と関係式の意味的違いがよく分からん

301:はちみつ餃子
21/08/09 14:30:20.02 OWI9S7jW0.net
>>297
・ 優先順位が違う
・ 関係演算子は複素数型をオペランドにとれない

302:デフォルトの名無しさん
21/08/09 15:32:43.41 WWM043YB0.net
結局は成り立つか成り立たないかってことでしょ
その2つを厳密に分ける意味はなに?

303:デフォルトの名無しさん
21/08/09 15:43:28.94 qYrd5+ip0.net
算術式 関係式 論理式 という分類は聞いたことがあるが>>295みたいなのは初耳だなぁ。

304:はちみつ餃子
21/08/09 16:04:49.05 OWI9S7jW0.net
>>300
条件式 (conditional expression) については C99 なら 6.5.15 に記述がある。
制御式 (controlling expression) という言葉は当たり前のように出現して
明確に定義を与えているらしい箇所がみつからないんだけど
仕様では >>295 の意味で使われていることは自明。

305:デフォルトの名無しさん
21/08/09 16:10:06.60 hymvfobjM.net
等価式 ⊂ 関係式
でしょ

306:デフォルトの名無しさん
21/08/09 16:23:09.32 JaaB5Egp0.net
文法定義上の用語だよ
区別する最大の意義は演算子優先順位の定義
>>293が不用意に「条件式」と書いてしまったばっかりに本質的でないツッコミが発生しただけ

307:はちみつ餃子
21/08/09 16:36:37.59 OWI9S7jW0.net
>>302
構文規則としては
等価式:
  関係式
  等価式 == 関係式
  等価式 != 関係式
と書いてあるからその考え方でも間違いとは言い切れないけど
それを言うなら
シフト式:
  加減式
  シフト式 << 加減式
  シフト式 >> 加減式
だからといって 加減式 ⊂ シフト式 と言ってしまうと (日常的な感覚としては) ちょっと違和感があるし、
このへんの言葉はシンタクスを定義する上での便宜的な概念 (BNF で書くとそうなるってだけ)
だから、演算子の機能上の意味付けとは分けて考える必要がある。

308:デフォルトの名無しさん
21/08/09 16:38:11.39 S8n0VVLE0.net
>>301
>>295の意味というのがよくわからんけどcontrolling expressionって例えばswitch( )のカッコ内もそうだから等価式と関係式だけじゃないよ

309:デフォルトの名無しさん
21/08/09 16:39:33.74 qYrd5+ip0.net
>>303
>区別する最大の意義は演算子優先順位の定義
まさにそこが疑問なんだけど、優先順位ごとに全部「△△式」って名前を付けて区別するのは見たことない。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch