エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/
探検
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
2018/07/01(日) 03:44:53.53ID:4MMF8cDN
290286 == 288
2018/08/30(木) 17:37:27.96ID:GbaSH31o たびたび失礼。
「試すんじゃなくて規格でどう動くべきか語れ」と言われればその通りだけど、
俺の能力を超えているということで。より有能な人の援護を期待。
「試すんじゃなくて規格でどう動くべきか語れ」と言われればその通りだけど、
俺の能力を超えているということで。より有能な人の援護を期待。
291デフォルトの名無しさん
2018/08/30(木) 23:00:44.23ID:kCgj5iLA292デフォルトの名無しさん
2018/08/30(木) 23:14:11.82ID:/0YXnEsV まず補数についてお勉強しなさい
まずそっから
そしてそれを8bit、16bit、32bitで表現するとどうなるか
考察しなさい
わかった?
まずそっから
そしてそれを8bit、16bit、32bitで表現するとどうなるか
考察しなさい
わかった?
293デフォルトの名無しさん
2018/08/31(金) 00:08:27.43ID:4ZfpOo1s https://ideone.com/gFxr1T
どっかから拾ってきた関数のソース(なんかのlibcのソース)をコピペして
signed charとunsigned charの2進表現をダンプしてやったから
補数のお勉強が捗ったら、あとで参考にしなさい
どっかから拾ってきた関数のソース(なんかのlibcのソース)をコピペして
signed charとunsigned charの2進表現をダンプしてやったから
補数のお勉強が捗ったら、あとで参考にしなさい
294はちみつ餃子 ◆8X2XSCHEME
2018/08/31(金) 00:18:16.04ID:NWzNDPzW 繰返すが、言語仕様上はビット表現についてたいした決まりがあるわけではない。
表現できる範囲に着目した方が理解しやすいんでないかなぁ。
表現できる範囲に着目した方が理解しやすいんでないかなぁ。
295デフォルトの名無しさん
2018/08/31(金) 00:19:55.81ID:4ZfpOo1s 決まりがなかったら
ビット演算なんかできない
バカのいうことなんか
ほっといていいからな
ビット演算なんかできない
バカのいうことなんか
ほっといていいからな
296はちみつ餃子 ◆8X2XSCHEME
2018/08/31(金) 00:26:44.11ID:NWzNDPzW 実際に決まってないもんは決まってない。
1 の補数を使うようなのも許されるし、実際に存在する。
ポータビリティに配慮しなければなんでも出来るのが C/C++ の良いところだが、
ガチで規格を把握しようとすると未定義の罠だらけなんよな。
1 の補数を使うようなのも許されるし、実際に存在する。
ポータビリティに配慮しなければなんでも出来るのが C/C++ の良いところだが、
ガチで規格を把握しようとすると未定義の罠だらけなんよな。
297デフォルトの名無しさん
2018/08/31(金) 00:27:45.45ID:4ZfpOo1s きっとバカのオツムでは
リトルエンディアンとビッグエンディアンの計算機では
ビット演算の結果がかわる
もしくは変わるようなクソみたいなコードを書く
もう察しがつくのが怖いわ。。。
リトルエンディアンとビッグエンディアンの計算機では
ビット演算の結果がかわる
もしくは変わるようなクソみたいなコードを書く
もう察しがつくのが怖いわ。。。
299デフォルトの名無しさん
2018/08/31(金) 00:42:21.23ID:4ZfpOo1s uint32_t aho;
unsigned char* baka = (unsigned char*)&aho;
知恵遅れはこんなことを平気でする
そして計算機によって結果がかわっておかしいおかしいとかいうワケ
unsigned char* baka = (unsigned char*)&aho;
知恵遅れはこんなことを平気でする
そして計算機によって結果がかわっておかしいおかしいとかいうワケ
300はちみつ餃子 ◆8X2XSCHEME
2018/08/31(金) 01:19:33.15ID:NWzNDPzW 関係ないことに話題を広げないでくれよ……。
301はちみつ餃子 ◆8X2XSCHEME
2018/08/31(金) 01:29:11.81ID:NWzNDPzW 数値のビット表現に2の補数が使われるとは限らないってだけの話な。
302デフォルトの名無しさん
2018/08/31(金) 06:31:48.92ID:Df6BGOL7 >>292
キャストの必要性と負の数の内部表現は全く関係ないように思うけど
キャストの必要性と負の数の内部表現は全く関係ないように思うけど
303デフォルトの名無しさん
2018/08/31(金) 06:35:22.71ID:Df6BGOL7 負の数の内部表現は
少なくとも以下の3種類は存在する
1の補数
2の補数
符号ビット
マイナスゼロはトラップ値として使ったりする
少なくとも以下の3種類は存在する
1の補数
2の補数
符号ビット
マイナスゼロはトラップ値として使ったりする
304デフォルトの名無しさん
2018/08/31(金) 08:21:09.97ID:kqLurM/K https://ideone.com/ub97A1
すいません↑の29行目のコードって何してるんですか?
int size = sizeof student / sizeof *student;
sizeofで studentと*studentが3に化けて 3,3で割り算して1じゃないんですか
意味がよく分かりません;
すいません↑の29行目のコードって何してるんですか?
int size = sizeof student / sizeof *student;
sizeofで studentと*studentが3に化けて 3,3で割り算して1じゃないんですか
意味がよく分かりません;
305デフォルトの名無しさん
2018/08/31(金) 08:43:55.47ID:CKe+Ima+ >>304
配列の定義が見えてる場合 "sizeof 配列名" は配列全体の総バイト数になるのよ。
対して "sizeof *配列名" は "sizeof 配列名[0]" と同じで配列要素1個のバイト数。
配列全体のバイト数 / 配列要素1個のバイト数 == 配列の要素数
配列の要素数を知るためのイディオムだな。
ちなみに sizeof student も sizeof *student も 3 にはならないと思うよ。
むしろ sizeof student / sizeof *student の計算でようやく 3 が得られる。
配列の定義が見えてる場合 "sizeof 配列名" は配列全体の総バイト数になるのよ。
対して "sizeof *配列名" は "sizeof 配列名[0]" と同じで配列要素1個のバイト数。
配列全体のバイト数 / 配列要素1個のバイト数 == 配列の要素数
配列の要素数を知るためのイディオムだな。
ちなみに sizeof student も sizeof *student も 3 にはならないと思うよ。
むしろ sizeof student / sizeof *student の計算でようやく 3 が得られる。
306デフォルトの名無しさん
2018/08/31(金) 08:48:39.35ID:B6cJ6E2C307デフォルトの名無しさん
2018/08/31(金) 10:31:41.89ID:kqLurM/K308デフォルトの名無しさん
2018/08/31(金) 11:51:09.55ID:B6cJ6E2C309はちみつ餃子 ◆8X2XSCHEME
2018/08/31(金) 18:49:29.63ID:NWzNDPzW310デフォルトの名無しさん
2018/08/31(金) 19:17:02.43ID:CKe+Ima+ でも具体的なビット表現、0か1がいくつか並んだものを見せて
「符号なしなら数値として〜、2の補数表現なら〜と解釈される。
それを符号拡張なりゼロ拡張なりすると…」
という具合に教えた方が理解は容易な気がするよ。
「規格では(値の範囲は決まっているが)ビット表現は決まっていない」の
一点張りで、抽象的な説明だけをしても分からんでしょ。
とりあえずcharは8ビット、負数は2の補数表現、のモデルで
話が飲み込めれば、その先のcharが8ビットじゃない処理系や
負の数の表現方法が異なる場合に進める。
どうせ大半の処理系は8ビット・2の補数だから無駄にもならんし。
8ビット・2の補数に凝り固まることのないよう、気をつけて教えるってことで。
「符号なしなら数値として〜、2の補数表現なら〜と解釈される。
それを符号拡張なりゼロ拡張なりすると…」
という具合に教えた方が理解は容易な気がするよ。
「規格では(値の範囲は決まっているが)ビット表現は決まっていない」の
一点張りで、抽象的な説明だけをしても分からんでしょ。
とりあえずcharは8ビット、負数は2の補数表現、のモデルで
話が飲み込めれば、その先のcharが8ビットじゃない処理系や
負の数の表現方法が異なる場合に進める。
どうせ大半の処理系は8ビット・2の補数だから無駄にもならんし。
8ビット・2の補数に凝り固まることのないよう、気をつけて教えるってことで。
311はちみつ餃子 ◆8X2XSCHEME
2018/08/31(金) 20:21:33.49ID:NWzNDPzW >>310
俺も先にアセンブラを触ってたタイプだからビット表現からの理解をしたのでそれが自然なんだけど、
0 と 1 の集まりで表される世界が、
表現範囲が決まっているという考え方よりも感覚的にわかりやすいだろうかと冷静に考えると
一般的にはそうでもなくない? って思えてるってのもある。
レイヤを分けて考えるってのはそんなに簡単ではないよ。
「コンピュータの中でこう処理されている」というのを知った上でそれを忘れて (抽象の壁の向こうに追いやって)
「言語の考え方 (規格) ではこうなっている」という理解を持てるかどうか……。
どうせ C を使ってるとやっぱり現実のコンピュータが透けてみえちゃうんだから、
「言語の考え方はこう」というのを押さえておけば
あとは自動的に「それを実現するために内部ではこうなっている」という風に理解していけると思うんだがなぁ。
俺も先にアセンブラを触ってたタイプだからビット表現からの理解をしたのでそれが自然なんだけど、
0 と 1 の集まりで表される世界が、
表現範囲が決まっているという考え方よりも感覚的にわかりやすいだろうかと冷静に考えると
一般的にはそうでもなくない? って思えてるってのもある。
レイヤを分けて考えるってのはそんなに簡単ではないよ。
「コンピュータの中でこう処理されている」というのを知った上でそれを忘れて (抽象の壁の向こうに追いやって)
「言語の考え方 (規格) ではこうなっている」という理解を持てるかどうか……。
どうせ C を使ってるとやっぱり現実のコンピュータが透けてみえちゃうんだから、
「言語の考え方はこう」というのを押さえておけば
あとは自動的に「それを実現するために内部ではこうなっている」という風に理解していけると思うんだがなぁ。
312デフォルトの名無しさん
2018/09/01(土) 00:56:02.54ID:8bxP8UXu313はちみつ餃子 ◆8X2XSCHEME
2018/09/01(土) 01:29:32.00ID:0H62RJv3 >>312
アセンブラの色々を自動化したみたいな立場からのスタートだから、
歴史的には具象から抽象へという形で成立しているが、
あくまで C を学び始めた人のスタート地点として、
「ビット表現、あるいは範囲が決まった値のどちらがなじみやすいか」という話。
普通の人が日常的に数値を扱うことはあるし、
その中には上限・下限が決まっているということもある。
でも、 0 と 1 の集合で表現するという考え方を日常的にしている人はかなり少数派だよ。
馴染みやすい方から入って行って最終的に「なるほど内部ではこう表現されるのか」
に至るのってそんなに不自然な道筋かな?
アセンブラの色々を自動化したみたいな立場からのスタートだから、
歴史的には具象から抽象へという形で成立しているが、
あくまで C を学び始めた人のスタート地点として、
「ビット表現、あるいは範囲が決まった値のどちらがなじみやすいか」という話。
普通の人が日常的に数値を扱うことはあるし、
その中には上限・下限が決まっているということもある。
でも、 0 と 1 の集合で表現するという考え方を日常的にしている人はかなり少数派だよ。
馴染みやすい方から入って行って最終的に「なるほど内部ではこう表現されるのか」
に至るのってそんなに不自然な道筋かな?
314デフォルトの名無しさん
2018/09/01(土) 11:33:31.89ID:8bxP8UXu315はちみつ餃子 ◆8X2XSCHEME
2018/09/01(土) 13:35:02.88ID:0H62RJv3 >>314
数値型変換の規則とかも数値として決まってる。
動作させるのにビット表現で考える必要は無いだろ。
なんらかのビット表現を割り当てて動作はするけど、
そりゃコンパイラの考えることで、
人が最初からどうしても把握しておかなきゃならないもんではない。
数値型変換の規則とかも数値として決まってる。
動作させるのにビット表現で考える必要は無いだろ。
なんらかのビット表現を割り当てて動作はするけど、
そりゃコンパイラの考えることで、
人が最初からどうしても把握しておかなきゃならないもんではない。
316デフォルトの名無しさん
2018/09/01(土) 14:58:35.23ID:lb2h//8s317デフォルトの名無しさん
2018/09/01(土) 15:48:37.66ID:GfEkw2/x 多倍長計算涙目
318デフォルトの名無しさん
2018/09/01(土) 16:37:00.14ID:/wwW4VSs 頭悪いからビット演算できないと自白してる
319はちみつ餃子 ◆8X2XSCHEME
2018/09/01(土) 16:46:00.86ID:0H62RJv3 >>316
繰返すが、数値のビット表現は世間一般の感性からすると全く異質だ。
だから「(いきなり最初には) イメージしやすくない」と言ってるの。
無理してでも最初に身につけられたら後が楽ってことはあるかもしれんが、
イメージしやすいってことは無い。
ビット表現は C に慣れた人にとってあまりにも当然の大前提すぎて、
それをわからん奴にはだいぶんイラつくが、
すんなりとは納得できない方が普通だよ。
繰返すが、数値のビット表現は世間一般の感性からすると全く異質だ。
だから「(いきなり最初には) イメージしやすくない」と言ってるの。
無理してでも最初に身につけられたら後が楽ってことはあるかもしれんが、
イメージしやすいってことは無い。
ビット表現は C に慣れた人にとってあまりにも当然の大前提すぎて、
それをわからん奴にはだいぶんイラつくが、
すんなりとは納得できない方が普通だよ。
320デフォルトの名無しさん
2018/09/01(土) 16:47:02.21ID:/wwW4VSs はいはい
頭悪いからビット演算できないと
だからどうした
頭悪いからビット演算できないと
だからどうした
321はちみつ餃子 ◆8X2XSCHEME
2018/09/01(土) 16:50:28.48ID:0H62RJv3322デフォルトの名無しさん
2018/09/01(土) 16:56:01.26ID:/wwW4VSs 健常者に届かないぐらい頭悪いから
オレはビット演算はあきらめた
と自白されても困るワケ
オレはビット演算はあきらめた
と自白されても困るワケ
323デフォルトの名無しさん
2018/09/01(土) 17:10:11.60ID:3YNLHjk8 外野から見ると自分は頭が良いと思い込んでそうなID:/wwW4VSsよりはちみつの方が賢そう
324デフォルトの名無しさん
2018/09/01(土) 17:11:33.86ID:/wwW4VSs オレは頭いいとか
ひとことも書いてないからな
キミラが健常者に程遠いほど
頭悪いわけ
それがわからない?
ひとことも書いてないからな
キミラが健常者に程遠いほど
頭悪いわけ
それがわからない?
325デフォルトの名無しさん
2018/09/01(土) 17:12:36.29ID:/wwW4VSs まず途方もないほど頭悪いという自覚がない
それが致命的
バカを自覚できないからバカが治らない
それが致命的
バカを自覚できないからバカが治らない
326デフォルトの名無しさん
2018/09/01(土) 17:14:33.25ID:np0z0HoI はちみつさんの主張「初心者にビット表現から教える必要はない」を
当人がビット演算できない僻み、とか捉えるのは明らかに間違いだろ。
対立が昂じて厳しい言葉を使いそうになった場を茶化すのは俺も好きだけど。
(余計に険悪になったところで「お呼びでない…」と立ち去る流れまで込み)
実際のところ「初心者に2進数での数値表現を理解させることが困難か?」
については、今なら「コンピューターの中ではゼロイチで情報が記憶される」
くらいの基本知識は持ってるだろうから、昔よりは敷居が低いんじゃないかな。
…とは言え自分もマシン語ハンドアセンブル相対ジャンプ暗算から
入ったクチだから、経験に基づいたバイアスが強いかも知れん。
ビット表現を使わず初心者に説明する良い資料があるなら読んでみたい。
たぶん得るところは大きい。
当人がビット演算できない僻み、とか捉えるのは明らかに間違いだろ。
対立が昂じて厳しい言葉を使いそうになった場を茶化すのは俺も好きだけど。
(余計に険悪になったところで「お呼びでない…」と立ち去る流れまで込み)
実際のところ「初心者に2進数での数値表現を理解させることが困難か?」
については、今なら「コンピューターの中ではゼロイチで情報が記憶される」
くらいの基本知識は持ってるだろうから、昔よりは敷居が低いんじゃないかな。
…とは言え自分もマシン語ハンドアセンブル相対ジャンプ暗算から
入ったクチだから、経験に基づいたバイアスが強いかも知れん。
ビット表現を使わず初心者に説明する良い資料があるなら読んでみたい。
たぶん得るところは大きい。
327デフォルトの名無しさん
2018/09/01(土) 19:35:38.40ID:iulr/33e "はちみつ餃子"でググってもそういうのが出てこない…
328デフォルトの名無しさん
2018/09/01(土) 20:41:28.08ID:V3Jbt1LZ >>326
必ず半角カナを使ってレスしてるいつもの人は、常に持論は正しく相手は低能というスタンスで一方的に断定しかしないから、深く考えても仕方ないよ。
半角君のいってることはまともなこともあれば的はずれなこともあるけど、常に共通するのは周りの指摘や疑問には耳を貸さず、議論の流れも無視して自分の主張を繰り返すだけということ。
だから、斜め読みして受け流すだけでいいと思うよ。
必ず半角カナを使ってレスしてるいつもの人は、常に持論は正しく相手は低能というスタンスで一方的に断定しかしないから、深く考えても仕方ないよ。
半角君のいってることはまともなこともあれば的はずれなこともあるけど、常に共通するのは周りの指摘や疑問には耳を貸さず、議論の流れも無視して自分の主張を繰り返すだけということ。
だから、斜め読みして受け流すだけでいいと思うよ。
329デフォルトの名無しさん
2018/09/01(土) 20:56:42.17ID:/wwW4VSs なるほど
知恵遅れは議論したつもりになってんのか
知恵遅れの場合議論できるレベルに到達してない
まずそこの自覚がない
知恵遅れは議論したつもりになってんのか
知恵遅れの場合議論できるレベルに到達してない
まずそこの自覚がない
330デフォルトの名無しさん
2018/09/01(土) 21:11:37.01ID:DoChZsV8 C形式の二次元配列は先頭から一次元配列みたいな顔して普通にアクセスできると思うんですが
C++11以降でネストしたstd::arrayでもポインタを使って一次元配列のようにアクセスしても規格上セーフですか?
↓のコードのようにforループ一つで上下左右方向の繰り返しを済ませたいです
https://ideone.com/HbRfZu
C++11以降でネストしたstd::arrayでもポインタを使って一次元配列のようにアクセスしても規格上セーフですか?
↓のコードのようにforループ一つで上下左右方向の繰り返しを済ませたいです
https://ideone.com/HbRfZu
331デフォルトの名無しさん
2018/09/01(土) 22:08:01.79ID:/wwW4VSs 1次元の可変の列を行とみなして
そのそれぞれの行に可変の1次元の列がある状態になってる
つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
そもそもC++の規格とか関係ない
低学歴であれば低学歴であるほど
言語の規格なんかぜんぜん分かってないくせに
自分を大きくみせるために言語の規格がどうこういってるのだけは
よおく分かったわ
そのそれぞれの行に可変の1次元の列がある状態になってる
つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
そもそもC++の規格とか関係ない
低学歴であれば低学歴であるほど
言語の規格なんかぜんぜん分かってないくせに
自分を大きくみせるために言語の規格がどうこういってるのだけは
よおく分かったわ
332330
2018/09/01(土) 23:53:24.94ID:DoChZsV8 >1次元の可変の列を行とみなして
>そのそれぞれの行に可変の1次元の列がある状態になってる
>つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
というのはどういうことでしょうか
行ごとにバラバラなので行をまたいでのアクセスはできないという意味でしょうか
C形式の多次元配列もネストされたstd::arrayも、各要素は連続したメモリ領域に置かれていますよね
というかC形式の(少なくとも)二次元配列は一次元配列として全要素にアクセスできると思っていたのですが
間違っていますか?
>そのそれぞれの行に可変の1次元の列がある状態になってる
>つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
というのはどういうことでしょうか
行ごとにバラバラなので行をまたいでのアクセスはできないという意味でしょうか
C形式の多次元配列もネストされたstd::arrayも、各要素は連続したメモリ領域に置かれていますよね
というかC形式の(少なくとも)二次元配列は一次元配列として全要素にアクセスできると思っていたのですが
間違っていますか?
333デフォルトの名無しさん
2018/09/02(日) 00:08:35.47ID:Tb3tt8fk array 1個作ったら1個ヒープできるのはわかる?
334はちみつ餃子 ◆8X2XSCHEME
2018/09/02(日) 00:20:34.44ID:vK23Frpo >>326
昔から C を使っている人ってまさにそういう感じの低レイヤや
それに付随するあれこれの知識と一緒に習得してきた人が多いと思う。
だけど、 Teratail とか StackOverflow とかでの質問を見てると、
俺らがあまりにも当然の前提と思ってそこにあることにすら気づいてなかったものが
今の入門者にとってはハードル高いのかもしれないと感じることが結構あって、
教え方も昔の通りにはいかないんじゃないかねと思えてるの。
昔から C を使っている人ってまさにそういう感じの低レイヤや
それに付随するあれこれの知識と一緒に習得してきた人が多いと思う。
だけど、 Teratail とか StackOverflow とかでの質問を見てると、
俺らがあまりにも当然の前提と思ってそこにあることにすら気づいてなかったものが
今の入門者にとってはハードル高いのかもしれないと感じることが結構あって、
教え方も昔の通りにはいかないんじゃないかねと思えてるの。
335デフォルトの名無しさん
2018/09/02(日) 00:23:28.95ID:PYGLVvbR >>330
Cでも未定義動作だよ。
JIS C (JIS X 3010:2003) 6.5.6 加減演算子
> 整数型をもつ式をポインタに加算又はポインタから減算する場合,結果は,ポインタオペランドの型を
> もつ。(中略)ポインタオペランド及びその結
> 果の両方が同じ配列オブジェクトの要素,又は配列オブジェクトの最後の要素を一つ越えたところを指し
> ている場合,演算によって,オーバフローを生じてはならない。それ以外の場合,動作は未定義とする。
Cでも未定義動作だよ。
JIS C (JIS X 3010:2003) 6.5.6 加減演算子
> 整数型をもつ式をポインタに加算又はポインタから減算する場合,結果は,ポインタオペランドの型を
> もつ。(中略)ポインタオペランド及びその結
> 果の両方が同じ配列オブジェクトの要素,又は配列オブジェクトの最後の要素を一つ越えたところを指し
> ている場合,演算によって,オーバフローを生じてはならない。それ以外の場合,動作は未定義とする。
336デフォルトの名無しさん
2018/09/02(日) 00:24:09.91ID:fnBlw2CS >>334
それって単にプログラミングをする人の増加の問題では
それって単にプログラミングをする人の増加の問題では
337デフォルトの名無しさん
2018/09/02(日) 00:26:27.09ID:Tb3tt8fk バカは自分で引用してる文章の意味がわかってない
ホントなかわいぞうなぐらい頭悪い
ホントなかわいぞうなぐらい頭悪い
338デフォルトの名無しさん
2018/09/02(日) 00:27:46.09ID:Tb3tt8fk バカはなんでとてつもなく自分がバカであるか
分かることは永遠にない
分かることは永遠にない
339デフォルトの名無しさん
2018/09/02(日) 00:34:24.38ID:7WdK6EV6340335
2018/09/02(日) 00:36:08.13ID:PYGLVvbR341デフォルトの名無しさん
2018/09/02(日) 00:42:46.41ID:eH7Ohm4T342デフォルトの名無しさん
2018/09/02(日) 00:50:28.37ID:Tb3tt8fk ヒープといのはオレがウソ書いてた
そのまま書いたら固定で配列がスタックにできる
アホが引用してるのは
あきらかに全然関係ない頭悪いのを引用してる
そのまま書いたら固定で配列がスタックにできる
アホが引用してるのは
あきらかに全然関係ない頭悪いのを引用してる
343デフォルトの名無しさん
2018/09/02(日) 00:54:46.07ID:Tb3tt8fk array
┣array
┃┣ int
┃┗ int
┣array
┃┣ int
┃┗ int
┗array
┣ int
┗ int
こうなる
┣array
┃┣ int
┃┗ int
┣array
┃┣ int
┃┗ int
┗array
┣ int
┗ int
こうなる
344デフォルトの名無しさん
2018/09/02(日) 01:03:53.61ID:Tb3tt8fk アホが引用してる部分は
たとえばこんなソースがあった場合、
int* ai_aho[3] = {1, 2, 3}
int* pi_aho = ai_aho;
for (int i = 0; i < 3; ++i, ++pi_aho) {
*pi_aho = 1;
}
pi_ahoはループを抜けたあと
pi_ahoはソース上適切でないアドレスをさしてるが
こいつを参照しなければ問題ないということが書いてある
たとえばこんなソースがあった場合、
int* ai_aho[3] = {1, 2, 3}
int* pi_aho = ai_aho;
for (int i = 0; i < 3; ++i, ++pi_aho) {
*pi_aho = 1;
}
pi_ahoはループを抜けたあと
pi_ahoはソース上適切でないアドレスをさしてるが
こいつを参照しなければ問題ないということが書いてある
345デフォルトの名無しさん
2018/09/02(日) 01:18:27.35ID:PYGLVvbR >>341
int a[N][M] に対して a + i するときの「配列オブジェクト」は要素型 int [M] で要素数 N の配列のこと。
N を超えて加算すると未定義動作になる。
a[0] + i するときの「配列オブジェクト」は要素型 int で要素数 M の配列のこと。
同じく M を超えて加算すると未定義動作になる。
ポインタを受け取る関数に a[0] あるいは &a[0][0] を渡した場合も M を超えて加算した場合は同じ理由で未定義動作になる。
期待した動作をすることも多いだろうけど、信頼性や移植性は損なわれる。
int a[N][M] に対して a + i するときの「配列オブジェクト」は要素型 int [M] で要素数 N の配列のこと。
N を超えて加算すると未定義動作になる。
a[0] + i するときの「配列オブジェクト」は要素型 int で要素数 M の配列のこと。
同じく M を超えて加算すると未定義動作になる。
ポインタを受け取る関数に a[0] あるいは &a[0][0] を渡した場合も M を超えて加算した場合は同じ理由で未定義動作になる。
期待した動作をすることも多いだろうけど、信頼性や移植性は損なわれる。
346デフォルトの名無しさん
2018/09/02(日) 01:18:43.68ID:7WdK6EV6 おまえのたとえばは前科があるから信用できん
コピペしろコピペ
コピペしろコピペ
347デフォルトの名無しさん
2018/09/02(日) 01:20:32.56ID:Tb3tt8fk (正)int ai_aho[3] = {1, 2, 3};
(誤)ai_aho[3] = {1, 2, 3}
目視で確認した
コレでいける
(誤)ai_aho[3] = {1, 2, 3}
目視で確認した
コレでいける
348デフォルトの名無しさん
2018/09/02(日) 01:23:43.36ID:Tb3tt8fk な、低学歴知恵遅れはなにも分かってない
まずなにも分かってないのに規格読んで分かったふりしてるのがよく分かる
まずなにも分かってないのに規格読んで分かったふりしてるのがよく分かる
349デフォルトの名無しさん
2018/09/02(日) 01:25:42.40ID:Tb3tt8fk 低学歴知恵遅れが規格読んでも
規格なんか分かるわけがないからな
そもそも基本的にポインタがどう加算されるかすら分かってないのに
規格なんか分かるわけがないからな
そもそも基本的にポインタがどう加算されるかすら分かってないのに
350デフォルトの名無しさん
2018/09/02(日) 01:43:11.24ID:Tb3tt8fk uint32_t aho[4];
uint32_t* p_aho32 = aho;
uint8_t* p_aho_8 = (uint8_t*)aho;
p_aho32++;
p_aho_8+=4;
どっちのアドレスも同じになる
配列の場合どうなるか
考え方はまったく同じだな
あとはもう分かるハズだ
uint32_t* p_aho32 = aho;
uint8_t* p_aho_8 = (uint8_t*)aho;
p_aho32++;
p_aho_8+=4;
どっちのアドレスも同じになる
配列の場合どうなるか
考え方はまったく同じだな
あとはもう分かるハズだ
351デフォルトの名無しさん
2018/09/02(日) 04:27:28.97ID:xXZGLywM ロベール05-09の関数内に引きこもりって章のサンプルコードが長すぎて読めません(3ページ使用)
<algorithm>ってファイルを始めてincludeしてるにも関わらず其れに関して何ら説明ないし…
この章に関しては静的変数はグローバル変数と同じように使えてプログラムが終わるまでずっと同じメモリを参照している
と覚えられれば必要十分ですか?
何か簡単なコードを書いて教えてくれると助かります
よろしくお願いたします。
<algorithm>ってファイルを始めてincludeしてるにも関わらず其れに関して何ら説明ないし…
この章に関しては静的変数はグローバル変数と同じように使えてプログラムが終わるまでずっと同じメモリを参照している
と覚えられれば必要十分ですか?
何か簡単なコードを書いて教えてくれると助かります
よろしくお願いたします。
352デフォルトの名無しさん
2018/09/02(日) 06:48:14.86ID:UYvvvhTW あってるしコードは気にしなくていい
353デフォルトの名無しさん
2018/09/02(日) 06:49:15.39ID:p4iMlD/t 例によってロベール著を読んでないし、下のコードはCだけど、
関数内static変数の説明なら、CもC++も変わらんだろう。
(行数節約のため詰め込み・省略してるので良いスタイルじゃない)
#include <stdio.h>
static void in_static(void) {
static int cnt = 0; /* staticな変数 */
cnt++;
printf(" static %d 回目!\n", cnt);
}
static void not_static(void) {
int cnt = 0; /* staticじゃない変数 */
cnt++;
printf("not_static %d 回目?\n", cnt);
}
int main(void) {
in_static(); not_static();
in_static(); not_static();
in_static(); not_static();
return 0;
}
こんな感じかな。
このコードには盛り込んでないけど、グローバル変数と違って
「関数内static変数には、基本的には関数の外からはアクセスできない」
という性質もある。
関数内static変数の説明なら、CもC++も変わらんだろう。
(行数節約のため詰め込み・省略してるので良いスタイルじゃない)
#include <stdio.h>
static void in_static(void) {
static int cnt = 0; /* staticな変数 */
cnt++;
printf(" static %d 回目!\n", cnt);
}
static void not_static(void) {
int cnt = 0; /* staticじゃない変数 */
cnt++;
printf("not_static %d 回目?\n", cnt);
}
int main(void) {
in_static(); not_static();
in_static(); not_static();
in_static(); not_static();
return 0;
}
こんな感じかな。
このコードには盛り込んでないけど、グローバル変数と違って
「関数内static変数には、基本的には関数の外からはアクセスできない」
という性質もある。
354デフォルトの名無しさん
2018/09/02(日) 07:47:30.33ID:xXZGLywM >>353
違う言語にも関わらず書いていただきありがとうございます
実際に実行してみてかなりスッキリしました
自動変数と静的変数の違い、しかと理解できました
関数についてるstaticも気になるところですが読み進めたいと思います
違う言語にも関わらず書いていただきありがとうございます
実際に実行してみてかなりスッキリしました
自動変数と静的変数の違い、しかと理解できました
関数についてるstaticも気になるところですが読み進めたいと思います
355デフォルトの名無しさん
2018/09/04(火) 08:18:27.05ID:bj+tb6HS char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};
は出来ないのに
char* str[]={"aaaaaaa",iiiiiii","uuuuuuu"};
が出来るのはなぜですか?
ポインタと配列は密接な関係にあるんじゃないんですか
よろしくお願い致します
は出来ないのに
char* str[]={"aaaaaaa",iiiiiii","uuuuuuu"};
が出来るのはなぜですか?
ポインタと配列は密接な関係にあるんじゃないんですか
よろしくお願い致します
356デフォルトの名無しさん
2018/09/04(火) 11:38:18.11ID:ClV8CEAe "aaaaaa" とか "iiiiiiiii" とか "uuuuuuu" がchar*型だから
char型の配列に入れようとしても無理な話
char型の配列に入れようとしても無理な話
357はちみつ餃子 ◆8X2XSCHEME
2018/09/04(火) 12:36:40.35ID:f5HJ/2BD 仮に出来たとしてどういう結果になって欲しいのだろう?
358デフォルトの名無しさん
2018/09/04(火) 12:51:15.55ID:bz6n3SY3 char str[]={"aaaaaa"};はできる
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};はできない
char *str[] = {"aaaaaa","iiiiiiiii","uuuuuuu"};はできる
char str[][9] = {"aaaaaa","iiiiiiiii","uuuuuuu"};ならできる
一番目は長さを指定しない配列変数の宣言で初期化により長さが指定されている。
二番目は{"aaaaaa","iiiiiiiii","uuuuuuu"}は文字列の配列なので変数の型と一致しないためエラーになる
三番目はポインタの配列なので配列の各要素を対応する文字列で初期化できる
四番目は配列の配列なので文字列の配列で初期化できる(ただし要素数の指定は必要)
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};はできない
char *str[] = {"aaaaaa","iiiiiiiii","uuuuuuu"};はできる
char str[][9] = {"aaaaaa","iiiiiiiii","uuuuuuu"};ならできる
一番目は長さを指定しない配列変数の宣言で初期化により長さが指定されている。
二番目は{"aaaaaa","iiiiiiiii","uuuuuuu"}は文字列の配列なので変数の型と一致しないためエラーになる
三番目はポインタの配列なので配列の各要素を対応する文字列で初期化できる
四番目は配列の配列なので文字列の配列で初期化できる(ただし要素数の指定は必要)
359デフォルトの名無しさん
2018/09/04(火) 14:22:07.00ID:JAXadswE >>355
前者の[]は、文字の「列」を表すから
後者の[]は、文字列ポインタの「配列」を表すから
charはcharacterの略称、characterは文字、それが複数個集まった列が文字列
列となっているものが根本的に違う
前者の[]は、文字の「列」を表すから
後者の[]は、文字列ポインタの「配列」を表すから
charはcharacterの略称、characterは文字、それが複数個集まった列が文字列
列となっているものが根本的に違う
360デフォルトの名無しさん
2018/09/04(火) 17:31:45.30ID:bj+tb6HS361はちみつ餃子 ◆8X2XSCHEME
2018/09/04(火) 17:48:16.60ID:f5HJ/2BD362デフォルトの名無しさん
2018/09/04(火) 18:01:39.16ID:gZnu4stV そのリテラル文字列はNULでターミネートされる
配列の長さが+1される
べつにNULターミネートしなくても
文字列は扱える
つまり長さが保存されないかわりに
NULでターミネートされてる
それをcでは文字列と呼称している
配列の長さが+1される
べつにNULターミネートしなくても
文字列は扱える
つまり長さが保存されないかわりに
NULでターミネートされてる
それをcでは文字列と呼称している
363デフォルトの名無しさん
2018/09/04(火) 18:04:32.71ID:gZnu4stV そして、charの配列要素が
1つの文字を表してるとは当然限らない
MBCのように連続する複数の配列の要素が
1つの文字を表すことが多い
で、strlen()で文字の数が返却されないのは当然
1つの文字を表してるとは当然限らない
MBCのように連続する複数の配列の要素が
1つの文字を表すことが多い
で、strlen()で文字の数が返却されないのは当然
364デフォルトの名無しさん
2018/09/04(火) 18:52:35.55ID:UJ5UaD/4365デフォルトの名無しさん
2018/09/04(火) 19:07:47.99ID:bz6n3SY3 >>364
それだと土曜日と日曜日の区別がつかないw
それだと土曜日と日曜日の区別がつかないw
366デフォルトの名無しさん
2018/09/04(火) 20:21:12.61ID:i0TPcXrC 月月火水木金金なので問題ないです
367デフォルトの名無しさん
2018/09/04(火) 20:25:08.61ID:bz6n3SY3 >>366
それより毎日が日曜日の方が良いなあw
それより毎日が日曜日の方が良いなあw
368デフォルトの名無しさん
2018/09/04(火) 20:43:24.10ID:gZnu4stV ユリウス日に変換してから計算するから
問題ない
問題ない
369デフォルトの名無しさん
2018/09/05(水) 08:41:31.77ID:w5sEnOXo >>365
火木「」
火木「」
370デフォルトの名無しさん
2018/09/05(水) 10:25:09.13ID:ZjqSDQmE そいつをlongのポインタにする知恵があれば誉めてあげるんだが
371デフォルトの名無しさん
2018/09/06(木) 23:16:14.27ID:xdo6cDUj int wday=5;
char week[] = "SunMonTueWedThuFriSat";
printf("%.3s",&week[wday*3]);
これでどうだw
char week[] = "SunMonTueWedThuFriSat";
printf("%.3s",&week[wday*3]);
これでどうだw
372デフォルトの名無しさん
2018/09/07(金) 06:40:53.97ID:Pk3Mmzkj 悪い例 (キャストの悪用、データサイズの勝手な仮定)
int wday = 5;
printf("%.4s\n", &((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]);
軽いジョークのつもりで書いてみたけど、セグメンテーション・フォールトが出て
動くまでに予想外に手間取ってしもうた。
原因はアドレス演算子 & の付け忘れだった。
int wday = 5;
printf("%.4s\n", &((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]);
軽いジョークのつもりで書いてみたけど、セグメンテーション・フォールトが出て
動くまでに予想外に手間取ってしもうた。
原因はアドレス演算子 & の付け忘れだった。
373デフォルトの名無しさん
2018/09/07(金) 06:59:23.46ID:itoB4vJx それを.3sで表示すれば371と同じ結果にならなかね?
374デフォルトの名無しさん
2018/09/07(金) 07:46:30.50ID:Pk3Mmzkj 表示幅の指定で .3 なら >>371 と同じになるよ。
英単語の省略形にピリオドをつけたいのは好みの問題なの。
今は曜日も月名もピリオドを付けないのが一般的なのかな。
<time.h> の asctime() も3文字3文字だね。
英単語の省略形にピリオドをつけたいのは好みの問題なの。
今は曜日も月名もピリオドを付けないのが一般的なのかな。
<time.h> の asctime() も3文字3文字だね。
375372
2018/09/07(金) 17:37:51.74ID:Pk3Mmzkj たびたび失礼、そしてまるっきり実用の役に立たない話ですまぬ。
&((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]
「いったん[]で配列形式でアクセスしてから要素のアドレスを得る」
なんて回り道をしないでも
(int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat." + wday
と素直にポインタの足し算だけでいけたね。
…難解Cプログラムに凝る人の気持ちがちょっと分かった気がする。
&((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]
「いったん[]で配列形式でアクセスしてから要素のアドレスを得る」
なんて回り道をしないでも
(int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat." + wday
と素直にポインタの足し算だけでいけたね。
…難解Cプログラムに凝る人の気持ちがちょっと分かった気がする。
376デフォルトの名無しさん
2018/09/07(金) 22:40:13.74ID:B/yxkRYZ intのサイズがcharのサイズの4倍でないと動かない
難解ではなくただの知恵遅れのコード
難解ではなくただの知恵遅れのコード
377デフォルトの名無しさん
2018/09/08(土) 01:17:02.50ID:ejo+9snz sizeofがイマイチ分からないです
型や変数のサイズを出す演算子ってのは分かったんですが
例えばこの例↓どういう風に化けてるんですか?
https://ideone.com/szVAAP
sizeof studentで要素数3だから3に化けると思うんですが、右の*studentは何に化けてるんですか?
型や変数のサイズを出す演算子ってのは分かったんですが
例えばこの例↓どういう風に化けてるんですか?
https://ideone.com/szVAAP
sizeof studentで要素数3だから3に化けると思うんですが、右の*studentは何に化けてるんですか?
378はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 01:27:45.49ID:VmsJpbI+ sizeof が返すサイズってのはバイト数だというのがよくわかってないのかな。
もう C++ では type_traits の std::extent を使って欲しい気持ち。
もう C++ では type_traits の std::extent を使って欲しい気持ち。
379デフォルトの名無しさん
2018/09/08(土) 01:39:35.14ID:j/6nk0eH380デフォルトの名無しさん
2018/09/08(土) 01:56:15.85ID:ejo+9snz381デフォルトの名無しさん
2018/09/08(土) 02:11:10.26ID:j/6nk0eH382はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 02:24:06.10ID:VmsJpbI+ >>380
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。
> int3個とchar一個だから13バイト?
この構造体中の char は MAX_NAME+1 個じゃん。
まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。
sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。
> int3個とchar一個だから13バイト?
この構造体中の char は MAX_NAME+1 個じゃん。
まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。
sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
383デフォルトの名無しさん
2018/09/08(土) 02:52:28.11ID:OyJ8jP1h384デフォルトの名無しさん
2018/09/08(土) 02:56:57.12ID:OyJ8jP1h385はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:03:57.30ID:VmsJpbI+386デフォルトの名無しさん
2018/09/08(土) 03:07:29.94ID:ejo+9snz >>382
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
387はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:08:42.91ID:VmsJpbI+ >>384-385
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
388デフォルトの名無しさん
2018/09/08(土) 03:13:32.57ID:OyJ8jP1h389デフォルトの名無しさん
2018/09/08(土) 03:17:21.63ID:OyJ8jP1h >>387
それも含めてね
それも含めてね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 空自機レーダー照射、音声データ公開 中国 ★3 [蚤の市★]
- 一律現金給付も消費減税もなし 高市内閣の経済対策に割れる世論 [蚤の市★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★] [蚤の市★]
- 津波警報の発表中にグーグル検索、AIが「すべて解除」と誤情報 [蚤の市★]
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 低所得層のマクドナルド離れが深刻に 広がる「ファストフード格差」の真相 米国 [少考さん★]
- 【実況】博衣こよりのえちえち朝活🧪 2
- 【実況】博衣こよりのえちえち朝活🧪
- 日本の女、とにかく子供を産まない。世界的に見ても恵まれた環境のくせに
- 【高市悲報】日本人のTikTokアカウントが続々収益化剥奪中!!乞食どもざまああああああああwwwwwww [394917828]
- ネトウヨ「中国は政府が人民に金使って世論操作のヤラセ書き込みをさせている国。」 [153490809]
- 残クレマイホーム爆誕 [715715613]
