C言語なら俺に聞け 144
■ このスレッドは過去ログ倉庫に格納されています
>>52
たまーに引数が多くて読みずらい関数とかをメンテするハメになったときに、コメントつけるためにやる程度。
例のような短いのでそんな事になってたら、元担当見つけて小一時間問い詰めろ。 GNUスタイルは大嫌いだったな。K&Rは行数削れるから、最初のころ使っていたけど。 >>52
人間が見る時の見易さのためだけにそう書いているのがある。言語としての決まりはない。
C言語で改行に意味があるのはダブルクォーテーションで括った文字列内とプリプロセッサが処理する#で始まる行ぐらいだ。 ,,-―--、
|:::::::::::::;;;ノ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::::::::::( 」 <見るべきソースを間違っている。
ノノノ ヽ_l \______________
,,-┴―┴- 、 ∩_
/,|┌-[]─┐| \ ( ノ
/ ヽ| | バ | '、/\ / /
/ `./| | カ | |\ /
\ ヽ| lゝ | | \__/
\ |  ̄ ̄ ̄ |
⊂|______|
|l_l i l_l |
| ┬ | char p[]="aiueo";
p[3]='\0';
ではエラー出ないのに
char *p="aiueo";
*(p+3)='\0';
は書き込み違反になるのは何故なの >>65
前者は配列変数のp、後者は定数を指してるポインタのp。 前者は文字列リテラルの複製を配列にセットしたうえで配列を書き換えてる
後者は(ポインタ経由で)文字列リテラルそのものを書き換えている >>66
>>67
リテラルのアドレスになるのかありがとう char *p="aiueo"; //これが通るのは必要悪
const char *p="aiueo"; //本来こうであるべき
*(p+3)='\0'; //constついてりゃ並みのアフォなら気付けるはず constの意味がわかって無いアホ。
リテラルが書き換えられないだけで、ポインターは別に書き換えてもいいだろ。 char * const と const char * の違い そういや前にどこにconst入れるとどこが定数扱いになるか色々やって調べたことあるなあ。 const char *p; と char const *p; は p が指す先が定数で char * const p; は p 自体が定数なんだよね。 まあしかしコンパイラには char *p = "..."; の宣言で *p に書き込みアクセスするような記述を見つけたら警告ぐらい出して欲しいところだな。
実際に(少なくともデフォルトでは)動かないコード吐くわけだし。 ポインタである以上なんでも指せるし、
どう使うかは完全に自己責任では? ま、確かに。他の所を指すように使い回せるけどね。うーん。 >>70に加えて、
const char* const p = "aiueo"; // p も *p も const
も使い分ければいいだけだろ。
つってもこの書き方、非標準なのか?以下ページ以外では見あたらない。
https://qiita.com/pink_bangbi/items/a36617bf1d5923743d69 >>79
ISO/IEC 9899:2011 A.2.2に書いてあるんだが、おまえさんには見えないのか?
7.3) type-qualifier:
const
restrict
volatile
_Atomic
7.6) pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer
7.6) type-qualifier-list:
type-qualifier
type-qualifier-list type-qualifier char **pをconstするとそんな感じにならなかったけ? あ、こういう問題作れるね。
・ それぞれの違いについて説明せよ。
const char **p
char const **p
char * const *p
char ** const p
char * const *p
char * const * const p
char const * const * const p
char const ** const p >>82
悪問だけどな。結局の所、
・constは複数回指定できる
・constの右側の固まり全体が定数と見なされる
だけだし。逆に言えば、それらを別物/良問として認識するような奴は上達しないのだと思う。
(記憶の前処理としてabstractionする癖がない)
だからこれまでそんな馬鹿げた問題を出す奴はC界隈には居なかったし、今後も多分そうだ。
CodeIQの広告でその手の問題をよく見るが、あれじゃ「馬鹿です」と自己紹介して居るも同然だし。
まあ所詮リクルート(コード書いてない連中)だからそんなもんだが。
とはいえ、何らかのテストで簡単にそいつの実力を把握できる事が出来るのなら、役立つのも確かだが。
そしてそれ以前にconstが大して役に立たないからなあ。 >>83
> ・constの右側の固まり全体が定数と見なされる
え? これ違わない? というのは
const char *p = "...";
の場合は p は p++ できたりして const じゃないから右側の塊ではない。 >>84
>const char *p = "...";
は char const *p = "":
に等しい、例外みたいなもんじゃないか? 変数型宣言と初期化を同時に記述してっからそうなるんだろ? >>82
1: const char **p
2: char const **p
3: char * const *p
4: char ** const p
5: char * const *p
6: char * const * const p
7: char const * const * const p
8: char const ** const p
1と2、3と5は同じ
char **pとchar const * const *pのパターンがない
こういう奴はプログラマーに向いてない >>87
例外ではない。
char部分はCでは常にcons扱い(=int等に変更できない)だから
constが修飾する対象に仕様上なり得ないだけ。
だからその2つは結果的に同じ意味になる。
というかCは文法例外はほぼ無いはず。 自分流に解釈して覚えるのはいいけど、それが世界の真実かのように講釈するのは恥ずかしいから控えた方がいいよ
まあこのスレではいいけど、リアルの人間関係では陰で馬鹿にされるだけだよ >>91
charがintに変更できないのがconstだからだと?
おまえさん char c; *(int*)&c = 1; が許されないことと勘違いしているのか? いかん、間違えた
おまえさん char c; (int)c = 1; が許されないことと勘違いしているのか? >>95
これってcをintに拡張して1を代入してcをcharに戻すの? >>97
当たらずといえども遠からず
自分で言ってて無理を感じるなら
それが正解だ >>97
んなこたあない
>>94の書いてるコードと同義で、cの先頭アドレスからint分の領域に代入するだけで、cを拡張したり戻したりしてるわけではない
gcc 3.xやVC++2008では通ったが今のgccではコンパイルエラーになる記法 思いっきりメモリーリークして実行時に大暴走する悪寒しかしない。 >>101
そうだよ
だけど一部の(まずいことに大手の)コンパイラが
左辺値としての用法を古くから許していた >>98
俺は初見ではcはcharのまま代入されて代入後の値がintとして評価されると見たんだが >>102
Cは95のコードを書く池沼は死んでよし、って言語なんだよ。
だからそんなのは問題にもならない。
94はよく見るが、95は見たこと無いぞ。 若造が見たことないのは仕方ないよ
活発に議論されていたのがC89制定を目指していた頃のことだから >>84,87,91,95 の流れがよくわからん
const <type> *p = ... が <type> const *p = ... と等価となる理由が例外ではなく
p を左辺値と解釈する隙間があるから ってこと? >>107
例外じゃないって立場は俺しか居ないのか?
その場合、お前らはこれを整合性よく説明できない馬鹿共だということになるが、それで良いか?
逆に考えてみろ。
君がそれを「例外」だとしているのなら、つまり「例外」でなければ君は
const <type> *p = ... // (A)
<type> const *p = ... // (B)
で意味が違うべきだというわけだ。
その場合、それぞれどういう意味と捉えるべきだと考えるのか、言えるか? 少なくとも俺は そういうもんだと覚えてるだけで説明はできない こんなの決め事なんだからもしそう言うのがあったとしても
> その場合、それぞれどういう意味と捉えるべきだと考えるのか、言えるか?
は、作った奴に聞くしかないだろ 例外でもなんでもなく、単にC言語の標準規格がそうなっているからとしか言いようがないけどな。
宣言指定子 (declaration specifier) は以下の3要素から構成されている (順不同)。
・記憶クラス指定子 (storage class specifier) : auto, register, static, extern, typedef
・型指定子 (type specifier) : void, char, short, int, long, float, double, signed, unsigned, struct/union指定子, enum指定子、typedef名
・型修飾子 (type qualifier) : const, volatile
ポインタ宣言子 (pointer) は以下の2要素から構成されている。
・*
・型修飾子 (type qualifier) リスト
いろいろ省略してるので細部は不正確かもしれないがC89ではだいたいこんな感じ。
参考: C11のYacc文法 http://www.quut.com/c/ANSI-C-grammar-y.html
で、なぜそうなっているかを自分流に解釈して自分の中で整合性を取るのはいいけど、それを他人に押しつけるなってことだね。 ちゃんと理詰めで理解できるやつもいれば
暗記するしかないやつもいる
世の中、人それぞれだな >>113
別に太陽が地球の周りを公転していると解釈してもいいんですよ?
結果さえ合っていればね。
ただその自分流の解釈を他人に講釈したら恥をかきますよって話。 >>113
> ちゃんと理詰めで理解できるやつもいれば
アホなの?
理詰めで説明できると言うならして見せろよ 「 ̄ `ヽ、 ______
L -‐ '´  ̄ `ヽ- 、 〉
/ ヽ\ /
// / / ヽヽ ヽ〈
ヽ、レ! { ム-t ハ li 、 i i }ト、
ハN | lヽ八l ヽjハVヽ、i j/ l !
/ハ. l ヽk== , r= 、ノルl lL」
ヽN、ハ l ┌‐┐ ゙l ノl l
ヽトjヽ、 ヽ_ノ ノ//レ′
r777777777tノ` ー r ´フ/′
j´ニゝ l|ヽ _/`\
〈 ‐ 知ってるが lト、 / 〃ゝ、
〈、ネ.. .lF V=="/ イl.
ト |お前の態度が とニヽ二/ l
ヽ.|l 〈ー- ! `ヽ. l
|l気に入らない lトニ、_ノ ヾ、!
|l__________l| \ ソ 無知なやつには
恥をかかせるよりも
教えないことが最も堪えるからな 何を教えるつもりなんだろう...
俺が思う正解は>>111に書いてあるんだが w 悪党の泣き声は言い響きだ
何を教えるつもりなのか聞き出したいんだなあwww どうせなにも出てこないのは既にわかってる
って>>115みりゃわかると思うんだが w 正直なところ
const int x
と
int const x
は同等、
というのは、決め事でいいと思うよ、何もかも原理原則で理解できる(までに細かくパースできる)人にはどうでもいいのかもしれないが。
‥えっと、細かい人にとって、この場合どうでもいいのか、どうでもよくないのか、どっちだったっけ?? 同等も何も、修飾する主体が変数だけなんだから、何をどう変えろと?
対象がポインタなのかポインタの内容なのかって話に意味の無い例を挙げてどうしたいんだ? >>116
>>125
禿同
というかいい加減、知らない奴が煽るとか止めろよドアホ共。それは長期的にスレを毀損する。
なお、俺は知っている奴が馬鹿を糞味噌に貶すのを止めはしない。
馬鹿なこと言わなきゃいいだけだし、
逆に、これが出来ないのがID制フォーラムが腐る原因だと思っているから。
ヒントは既に書いたし、それ以前にC流の文法解釈をすれば特段不自然でもないし。
「例外」だと言いつつ(A)≠(B)を妥当とする根拠もないのはただの自己矛盾だと気付け。
そしてK&RはCの作者によって書かれているんだが、それも知らないのか?
Cしかなかった昔ならともかく、今お前らみたいな馬鹿がCやる理由は無いと思うんだがなぁ。 >>126
で、K&Rのどの記述からconstに関する解釈(constの右側の固まり全体が定数と見なされる)を読み取ったの? K&Rにconstはねえな
constの設計は髭と禿の合作だが >>128
ここに来て堂々と嘘をつくとか、お前も死んだ方がいいな。
K&Rが手元にあるのなら、目次見てみろよ。 煽ることしかできないアホ ⇒ ID:u4QX+fVn0, ID:8LuLzpAV0 constがないK&Rが本のことだと思ったアフォはもう死んじまったのか? 家のは、4-320-02145-2だけど、constは無いな プログラミング言語Cの第2版(白本)は初版(緑本)と違ってANSI規格準拠
型修飾子や型指定子の項目にconstは存在する
というかconstとvolatileはANSI標準で新設されたものと明言されてる
一般には同一著者なので第2版まで含めてK&R本と呼ばれているから紛らわしい 緑は初版じゃ無いよ。
初版は白。だから紛らわしいの。 あ、そうか
第2版の翻訳訂正前の表紙が緑だったっけ?
現在発売中のものの表紙は白だよ
https://www.amazon.co.jp/dp/4320026926 プレンティスホール版で言う所の「ANSI DRAFT」の斜線入り
に相当する版が緑色だったかと。
4.xBSDやOS-9がこの前の版のCなので、未だに残っているんでしょうね >>141
そう言えば最後にK&Rスタイルで書いたのはOS/9-68Kだったな
もう25年ぐらい前の話だが ゴガギーン
ドッカン
m ドッカン
=====) )) ☆
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこいOgju
「 ⌒ ̄ | | || (´Д` ) \___________
| /  ̄ | |/ 「 \
| | | | || || /\\
| | | | | へ//| | | |
| | | ロ|ロ |/,へ \| | | |
| ∧ | | | |/ \ / ( )
| | | |〈 | | | |
/ / / / | / | 〈| | |
/ / / / | | || | |
/ / / / =-----=-------- | | openじゃなくてfopenみたいに、ファイルの存在確認のaccess関数に
対応するちょっと上位の標準関数ってある? >>147
stat()とfstat()なんかどうだ?
まあでもopen(), fopen()の関係とは違うけどな。
open()はシステムコールだがfopen()はライブラリ関数だ。
(UNIX系OSの話ではあるが)。 俺の希望は、たいしたやりたくもないけど、
ちょっとやってみたら?とか丁寧に教えるからやってみなよ!
とかさ、そういう感じで優しく接してもらってだな、で、出来も悪いからなかなか覚えないけどそれでも教える側が知恵を絞ってどうにかうまく理解させる方法はないだろうかと創意工夫して育てる環境というのかな。とにかく頼むよまじ >>148
stdio.hにaccess()の偉いやつあるのかなー と思ったのだよ
無いならまあいいけど >>149
授業料ももらってないのに優しく教える理由なんかないわな
5chなんて煽り合いと罵り合いの場だよ >>149
日本語でおk
そして死ね
> 出来も悪いからなかなか覚えないけど
なら覚えるまで何度でも読み返せ
> 教える側が知恵を絞ってどうにかうまく理解させる方法はないだろうかと創意工夫して
教わる側が1mmも努力せず、教える側に全責任をなすりつけるのは典型的ゆとり。死ね。
というかな、はっきり言えば昔より格段に環境は良くなっている。
当然教える側のノウハウも蓄積されてるし、
本も大量に出版され、良書以外は淘汰されてるし、
Webにも情報があふれ、ここみたいな掲示板やフォーラムもあるし、
無料でIDEも使えるし。
だから昔の環境で手こずった奴も、今なら楽勝で学んでいける。
問題は、昔だったら(=IDE無しでは)お話にならない馬鹿にもプログラミングさせようとしていることであって、
俺はこれに関してはもう諦めた方がいい=手取り足取り教えないと出来ない奴は死ねでいい、と思っている。
自分の為に他人に無償の努力を強いるその姿勢が根本的に間違っている。
つかマジで、ゆとりのノリでやりたいなら、C以外のゆとり用言語を使え。Javaとか。新しいのならGoとか。
そしてこれとは別に、俺は2chとは別の掲示板を立ち上げようとしているのだが、
君はこれについて興味あるか?
追える限りでの発言を確認したが、君は煽るだけの無能ではないらしい。
俺は今の2chのシステムでは行けるところまで行っている(既に飽和している)と見ているから、
これ以上の物を求めるのなら何かしら新しい機能が必要だと考えている。
今はそれのアイデア出し中だ。何かあれば是非。 漠然とした質問で失礼します。
私は最近c言語の勉強を始めたところでギリギリポインタ等も理解できたところです。
そこで、アルゴリズムとデータ構造の勉強をしようと思い本を何冊か買ってきたのですが、
スタックなどのデータ構造の仕組みがよくわかりません。。
どの参考書でも、「スタックとは後入れ先出しで…」という説明の後、「それではc言語でスタックを
実装してみましょう」といって意味不明なコード(長い)が書かれているパターンが王道のようです。
このパターンは線形リストとかでも同じです(諸兄にはいうまでもないでしょうが…)。
どのような実益があってこのようなデータ構造を生成する必要があるのでしょうか。
python等でいうところのリストに相当するデータ構造をc言語で作成するためということ?
また、実際のプログラムにおいては、データ構造の定義だけでかなりコード長くなると思われるのですが、
よく利用される手法なのでしょうか。 >>153
std::stack相当の話?
なら大して使わないから、とりあえず読み飛ばしていい。
つか、最初から全部キッチリ理解しようとせず、
まずは分かる範囲で組み、その後、自分の出来る範囲を広げていくようにした方がいい。
(1度読んで全部理解して捨てる、ではなく、最初から5回読む前提で分かるところから読み進める)
そのうち、stackを使うべき用途に遭遇したら、なるほどと理解できるようになる。 >>153
直近のご要望としては、スタックの使い所を知りたいって事かな?
ほとんどの実行環境において、C言語の関数呼び出しなんかの実現に使われてるよ。
呼び出した側の状態を保存する場合にpush、呼び出され側から戻るときにpop的な。 >>153
どのような実益?そうだなあ。スタックといえば以前PerlでXMLの階層構造を
SAX使ってRDBに全て入れる時に使ったなあ。まあ、それだけでなく先入先出に
するとやりやすくなる処理はあるよ。再起処理でも使われるし(スタックに積まれて
いるとあまり意識する必要ないかもしれないが)。
リストは例えば長さが可変長のファイルからデータ取得してメモリ上に置いておく
時に使えるかな。
まあしかしライブラリにあるならそれ使った方が楽だよ。毎回書くのは阿保らしい。 ■ このスレッドは過去ログ倉庫に格納されています