C言語なら俺に聞け 157

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0345-kMi9)
垢版 |
2021/06/28(月) 11:22:51.50ID:so+vl3vs0
!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言語なら俺に聞け 156
https://mevius.5ch.net/test/read.cgi/tech/1601271690/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/06/28(月) 11:26:33.76ID:so+vl3vs0
前スレ末期の流れを再掲
> 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だけでいいものをそう記述してるのが気持ち悪い。
2021/06/28(月) 11:28:49.59ID:so+vl3vs0
>>前スレ1000

いやcharのサイズが知りたいのではなく
キャスト式(char)123のサイズを調べようとしたんだ

Cはchar変数の値を使おうとするとintに拡張するし文字定数もint型なので
char型の値を持つ式なんてあるのかって
2021/06/28(月) 11:37:03.08ID:XSoi24UgM
cppreferenceのc operator precedenceの項の注釈によるとオペアンドはtype castにはできないって書いてあるね。ただ仕様書の該当箇所は探せなかった
2021/06/28(月) 11:58:43.53ID:so+vl3vs0
脚注2は俺が気持ち悪いと言ったことと似てるけどsizeof(int)*pが
(sizeof(int)) * pという算術乗算になるという話なら単項式のsizeofより優先順位が低いからまだわかる
2021/06/28(月) 12:57:31.08ID:XSoi24UgM
A.2.1が引用元みたいなんで読んでみるとsizeof (int)123はダメだね。
sizeof +(int)123なら動くようだ。sizeof (int){1}も動きそう。
2021/06/28(月) 15:54:14.85ID:so+vl3vs0
あーそうか
A.2.1. (6.5.3)では
unary-expressionに該当するものの1つに
unary-operator cast-expressionがあるけど
unary-operatorにキーワードsizeofが含まれず、
カッコなしのキャスト式は
sizeof unary-expressionとなっていて
sizeof cast-expressionではないってことか
8デフォルトの名無しさん (ワッチョイ 3fad-wfqF)
垢版 |
2021/06/29(火) 00:32:13.44ID:jRoYjmsV0
ところで sizeof((char) 123) と sizeof(char) って同じことだよな?
2021/06/29(火) 01:01:59.00ID:cYz04uBKM
ポインタキャストは敷居線さえ跨がなきゃ思い通りの値出てくるけど
数値キャストは難しいんだよな
2021/06/29(火) 01:04:11.67ID:lZY/6JCta
>>8
GCC 9.3.0 では両方とも 1 でした
2021/06/29(火) 01:05:05.10ID:cYz04uBKM
printf さんの独自性もあるし
12デフォルトの名無しさん (ワッチョイ 3fad-wfqF)
垢版 |
2021/06/29(火) 02:00:52.74ID:jRoYjmsV0
>>10
ていうかやるまでもなく結果が同じにならないとおかしいよね。
一方は値を char 型にキャストしているんだから sizeof の結果は char 型のサイズになる。
もう一方は char 型のサイズを求めているから char 型のサイズになる。
2021/06/29(火) 04:29:15.93ID:OP5z1lEO0
二項演算子のいくつかでは汎整数拡張が適用されることになっているが
sizeof に渡す分には char のオブジェクトは char のオブジェクトだよ。
14デフォルトの名無しさん (ワッチョイ 0fd2-hdpQ)
垢版 |
2021/06/29(火) 08:37:44.49ID:F75/2W0I0
char型 + char型 の式でもint型に拡張されるんだっけ?
2021/06/29(火) 13:20:32.79ID:f0Xm8hptd
もち
単項プラスでさえ拡張する
2021/06/29(火) 13:41:07.94ID:dKjX5GmV0
typedefによる新しい型の定義って、コンパイラの工程的にはどの工程で定義されるの?
字句解析?構文解析?プリプロセスじゃないよね
2021/06/29(火) 14:16:01.66ID:NxeKtV2S0
質問が間違ってる気がするけどね。
コンパイルレベルで処理されるのか、リンクするまで処理されないのか、でしょ。
で、typedefは前者
2021/06/29(火) 20:18:28.43ID:SX14oDOe0
翻訳段階の何番目でやってんのかって質問だろ
2021/06/29(火) 20:52:30.02ID:0ahpifum0
構文解析の後 typedef と認知したうえで、シンボルのテーブルに追加してかないと
置換?読み替え?はできないよねぇ…

C言語は、その構造上1回の通読では解決できないんだっけ?
2021/06/29(火) 21:06:15.61ID:SX14oDOe0
5.1.1.2 Translation phasesくらい読んでから来いよ
2021/06/29(火) 22:00:49.44ID:NxeKtV2S0
だからぁw
構文解析ってのはパーサね?w←これは例えばbisonで作るやつね?w
字句解析ってのはレキシカルアナライザね?w←これは例えばflexで作るやつね?w
レキシカルアナライザかパーサかって、そもそもレキシカルアナライザってのは
字句区切るだけだよwそれをどんな命令であるかを解釈を決めるのが構文解析ねw

コンパイルの1pass,2passって話なら、まあそれでもいいけどさw
用語がでたらめすぎんでしょ。
だいたいそんなこと知ってどうするんだよ?w
2021/06/29(火) 22:05:17.86ID:gp7v5PNW0
セキュリティホール探し?
2021/06/29(火) 23:35:14.00ID:dKjX5GmV0
Cの構文解析器実装してるんだけどBNFのtypedefの扱いがイミフなんだよねー
2021/06/29(火) 23:57:55.23ID:NxeKtV2S0
>>23
またぁw
BNF関係ないでしょうw

つか、typedefなんて意味不明なんてことはないと思うけど。
特定の記法のことを指してるの?BNFで書かれた
typedefの規則が読みとれないって言ってるの?w

typedef struct {...};

struct {...} xxx;
を区別できないとかそんな話?
よくわかんないけど、変に切り出すんじゃなくて、
ストレートにこれがやりたいけど、これどうしたらいいか
わかんない、って聞く方がいいと思うんだが。
なにいってんだか、知ってる人ほど却ってわかんねーと思うんだが。
2021/06/30(水) 00:35:54.93ID:dsegDYOD0
typedefがstorage-class specifierに属してることを言ってるなら
構文上の便宜のためだけ(for syntactic convenience only)って6.7.1(5)に書いてあるけど
Annexのsyntax summaryだけ見てる感じかな

かなりエスパーしてるから的外れだったらすまぬ
2021/06/30(水) 01:02:59.78ID:xHlidKVh0
みなさんレスありがとう
「C BNF」でググって一番上に出るBNFを参考に実装しているんだけど、BNFが古いせいかtypedefの構文が欠落してるような気がして(気のせいでした。↓のレス参照)
でも<typedef-name>という要素はあるからtypedef機能自体はあるらしい
BNFに書いてないってことは構文解析以前の処理になるのかもしれないと思ってここで聞いてみたんだけど
混乱した人もいるみたいですまない

>>25
あー!そういうことですか
なるほど疑問が解けました
typedefをspecifierで扱ってるわけですね
ありがとうございます
2021/06/30(水) 06:48:58.92ID:tpFz8l2w0
typedefがないってことはK&R Cか

規格票でもドラフトでもいいから拾って読んでみ
http://www.open-std.org/jtc1/sc22/wg14/
2021/06/30(水) 09:43:56.46ID:xHlidKVh0
>>27
参照してるBNFはおそらくK&R Cですね
関数の宣言が古いスタイルになっているので
ありがとうございます、参照してみます
2021/07/17(土) 09:12:05.75ID:17h8nqYk0
リスト型構造体配列って他の言語でもあるのでしょうか?
現在職業訓練で勉強中なのですが、独学でやらないといけない範囲のようでして、
時間的余裕があまりない状態です。

他言語でも似たような考えが出てきて、Cで覚えておくと役立つなど
ございましたら、頑張って挑戦してみようと思っています。
2021/07/17(土) 12:16:52.25ID:xP6i4weKM
リスト型構造体配列ってのは講師の人の自作用語?
それなら定義を示してもらわんと。
2021/07/17(土) 12:38:05.00ID:+M7J9sQi0
リンクリストなら他の言語にもある
普通は配列とは言わないからその言葉は謎だけど……
2021/07/17(土) 13:34:21.36ID:e6axNbpd0
ポインタの代わりに配列のインデックスを保持してるような感じなのかね?
リスト型構造体配列
33デフォルトの名無しさん (ワッチョイ c628-0cQV)
垢版 |
2021/07/17(土) 16:17:40.91ID:USprSk230
C99かそれ以降の標準的な環境において

(bool)someval



!!someval

って(例外なしに)全くおなじ効果を生むと思っていいですか。

前者はJISX3010の6.3.1.2などで「値が0になるなら0,それ以外なら1」と書かれている一方,
後者は(初学者なので経験がなく,正しい認識ではないかもしれませんが)慣用的な書き方なので
規格票にも書かれておらず,正確に同じ意味なのかどうかを確かめられませんでした。
2021/07/18(日) 00:36:46.74ID:vIcCvIPT0
>>33
「意味するところは全く違うが、結果だけ見れば全く同じ」です。
35デフォルトの名無しさん (アウアウウー Sa39-rGUB)
垢版 |
2021/07/18(日) 01:19:32.77ID:euqgtMPHa
bool型が導入されたことで得られるメリットはは何かあるでしょうか
またデメリットはあるでしょうか
2021/07/18(日) 07:53:07.50ID:OEfNT0QGM
メリットは、必ず真偽値になること

デメリットは、必ず真偽値になってしまうこと
例えばエラーコードのようにいい加減な経緯で拡張していくことはできない
2021/07/18(日) 09:54:45.66ID:9YAoR/6C0
>>35
ctypes.h の isalpha() とか islower() とかその他大勢は、偽のときは 0 を必ず返しますが、真のときは 1 とは限らない 0 でない別の数を返したりするんですよ
そういうのは紛らわしいので、そういう紛らわしさが減る bool の存在はありがたいですね
38デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/18(日) 16:58:13.77ID:jPlpwmsoF
関数の () は演算子
キャストの () は演算子
だそうですが
数学の数式で優先度上げるのに相当する () は演算子ですか?
2021/07/18(日) 17:14:40.88ID:6AMrYKMS0
いいえ
2021/07/18(日) 20:03:28.13ID:i83/r50ia
>>34
ありがとうございます!
2021/07/18(日) 20:08:43.08ID:i83/r50ia
>>34
すんません
入力欄間違えました。
2021/07/18(日) 21:49:36.58ID:+Ch+KzUq0
>>33
真偽値型にキャストした結果の型は _Bool で、 !! を通した型は int という違いはある。

https://wandbox.org/permlink/zlxhRTGr5Sj8IsiH

整数を扱う多くの場合では整数拡張が入ったりして違いが吸収
されてしまうからどちらでもいい場合がほとんどだと思うけど、
あらゆる状況で完全に同じとは言い切れない。

ちなみに C++ では整数に ! を適用した結果は bool なので、
もちろん !! の結果も bool になる。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況