C++相談室 part134

■ このスレッドは過去ログ倉庫に格納されています
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/03/21(水) 20:33:11.12ID:MouF+uE40
read なり write なりを「使う」のは別にいいよ。
それを C++ 上でどのように抽象化すればいいかって話なんだから。
そういうレイヤの違う話を混ぜ込んでくるなよ。
2018/03/21(水) 20:43:51.09ID:KgSvodNyd
そこで新しい型を設けてまで << を使う意味がない
cout にバイナリでシリアライズするときはどうすんの?
size_t serialize(const T& t, ostream& os)
とかを各型用に書く方がマシ
2018/03/21(水) 20:47:43.15ID:KgSvodNyd
バイナリでシリアライズするに際して
別の型のストリームオブジェクトを作ってまで
<< だの dec だの endl を使えるようにすることの利点を説明して欲しい
2018/03/21(水) 21:36:05.23ID:9NBOfW2C0
例外を除いて
operator<<()は書式化出力
write()は非書式化出力
なのでバイナリを出力するときはwrite()を使うべき

>size_t serialize(const T& t, ostream& os)
シリアライズのような複雑な操作をするときはこれは悪い選択じゃない
というかstreamそのものを放り込むのはたまに見かける
2018/03/21(水) 22:02:23.07ID:52xrh1HkM
えっブロックデバイスにもStreamを
2018/03/21(水) 22:15:54.63ID:MouF+uE40
>>715
書式化 (formatted) ってのと、結果がバイナリかというのは直行する概念だよ。
シリアライズってのはオブジェクトのバイト列をそのまま出力することじゃなくて、
バイナリ形式の特定のフォーマットにして出力することだろ。
それは書式化って言うんだよ。
2018/03/21(水) 22:26:24.75ID:MouF+uE40
>>714
マニピュレータを使える意味はないかもな。
使えないように定義することも出来るし、意味がないなら使えないようにしておくべき。

ここでは抽象化の話をしているんだ。
出力先が人向けのテキスト表現であるか機械向けのシリアライズ表現であるかによって
書き方を変えなきゃならない、相手を意識しなきゃならないというよりは、
相手によって自動で切り替わって欲しいってことなんだよ。

意識しなくていいデザインってのは意識しにくくなるってことと表裏一体だから、
見えなくなるのが気にくわないってのならわかる。
2018/03/21(水) 22:26:32.59ID:OwhHF7Zm0
直交
2018/03/21(水) 22:29:29.81ID:MouF+uE40
>>719
スマソ。 >>717 の直行は直交の書き間違いやね。
2018/03/21(水) 23:13:33.75ID:NRxI71LE0
無意味な処理が嫌だとか言っておきながら
ここでは無駄の塊みたいな方法を勧める
アホですね
2018/03/21(水) 23:50:04.75ID:MouF+uE40
>>721
俺は一貫して抽象化の話をしてるつもりなんだが。
プログラマの意図を表現できる書き方をすべきって話をしてんの。
無意味な処理をしろと書いてあるのをプログラマの意図として読み取っていいのか?
そうじゃないだろう。

C++ がせっかく用意しているライブラリを活用するのが無駄なのか?
そうじゃないだろう。
723デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/22(木) 07:21:49.59ID:tiDItZ1f0
ハッキリ言ってストリームは蛇足だったわ。
廃止したほうが良いわ。
724デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/22(木) 07:25:52.15ID:tiDItZ1f0
Boostもそうだけど、有り余るC++のパワーをカッコよく使いこなそうとしてやっちまったみたいな。
もうちょっと使う側の立場にたつべきだな。
2018/03/22(木) 08:38:59.71ID:0Y4DSJfq0
黒魔術だなんだ言って楽しめないようではC++は向いていない
2018/03/22(木) 10:14:29.52ID:Q5Rs9TJ/0
蛇足ねえ。。。
禿本1stでoperator overloadのデモ用に作られたサンプルなんだが
そういうのは後で取って付けた存在といえるのか?
2018/03/22(木) 17:28:14.63ID:PBLsyShY0
業界全体としては奥の深さを求める人(求道者)を一か所に集め留めるのには非常に有益な言語
2018/03/22(木) 17:34:08.02ID:0Y4DSJfq0
そのうちAsioやRangeあたりも標準化されるだろうし
もうその方向に突き抜けてほしい
使いやすい言語なんか他にいくらでもある
2018/03/22(木) 17:41:04.44ID:HExEyyqO0
具体的にどういうときに不便なのか語れよ。
使いにくいってだけじゃ何にもわからん。
2018/03/22(木) 17:43:00.10ID:0Y4DSJfq0
C++に関しては慣れてない人がそう言ってるだけだから
2018/03/22(木) 19:57:57.53ID:sR+euIcT0
>>726
どの資料だったか覚えてないけど、演算子オーバーロードに関して
先生は「元の演算子の意味とかけ離れた挙動をさせるのは避けるべきだ」
みたいなことも書いてるよな。

まぁ、原則は指針であって絶対の規則じゃないわけだけど、
<< >> をビットシフトからストリーム入出力に振り替えておいて
どの口で言うか、このハゲッー! とか思ったり。
2018/03/22(木) 20:06:11.34ID:0Y4DSJfq0
>>731
ストリームのような周知の事実になっているものはそれには当てはまらないでしょ
2018/03/22(木) 20:22:42.90ID:HExEyyqO0
>>731-732
まああれくらいのものになると、オブジェクトに追加で突っ込んでいくような動作が「元の演算子の意味」になっちゃってるよな。

そんなことより C++20 に入る予定のカレンダーでは日付を 2018y/mar/22 とか書けるらしくて、
これはさすがにクソやろ……。
これもいずれ普通に受け入れる気持ちになるだろうか。
2018/03/22(木) 20:47:25.31ID:0Y4DSJfq0
>>733
既にfilesystemのpathが/で階層作れるから
current_path / "aho" / "baka"みたいに
C++の演算子は連想ゲームだ
2018/03/22(木) 22:18:28.94ID:Q5Rs9TJ/0
>>731
あの頃の禿はreverse_iteratorなんて思いもよらず
operator+が減算の動作をすることを否定してたね
2018/03/23(金) 00:38:32.35ID:2SqL+aT8a
>>733
日付の表記は何種類かあるし年/月/日でも日/年/月でも表せるなら結構便利だと思う。
2018/03/23(金) 08:21:50.21ID:VCdaFb7Y0
>>733
標準に「日付を表す型」みたいのが追加され、
それ用リテラルの接尾語(のひとつ)が ""y で 2018y は2018年を表す、
さらにこの型では / は日付要素を区切る演算子としてオーバーロードされてる。
…といった感じか?

確かに虚心坦懐に / を見れば、割り算のコンピュータ向け代用記号だけでなく
日付の区切りや、ファイルシステムの階層区切りでもあるけど。
2018/03/23(金) 09:13:18.25ID:xSYf1jdZ0
aのb乗
a^b
a**b
2018/03/23(金) 10:31:52.82ID:fMiQp2pkd
こんだけ演算子は深いのになぜか未だに[]は引数を一つしか取れない
740デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/23(金) 10:45:38.60ID:COiOJTLla
「静的」、「動的」というのがよく分からないのですが、詳しく書いてある本はありますか?

ヒープ領域がどうたらとかいうのもよく分かりません。
スタックとかいうのもよく分かりません。

詳しく解説している本を教えてください。
741デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/23(金) 10:48:57.55ID:COiOJTLla
ロベールのC++の本を読んでいて疑問に思いました。
2018/03/23(金) 19:28:55.75ID:FQA7q+b8M
>>737
> …といった感じか?
そんな感じらしい
http://d.hatena.ne.jp/yohhoy/touch/20180322/p1

日本だと基本 年/月/日 しかないしソースコードに 睦月、如月、弥生 なんて書く奴はいないからいまいち便利さがわからんけどあちらの人にとっては便利なんだろうか
2018/03/23(金) 19:30:12.07ID:5ELqDBlL0
ポップとプッシュの概念もよく分かってないのでは
http://www.cc.kyoto-su.ac.jp/~yamada/ap/stack.html
これが分かって来るとC++に於けるバッファオーバーフローBOF攻撃の仕組みが分かって来る
2018/03/23(金) 19:42:22.13ID:5ELqDBlL0
バッファオーバーフロー: #1 概要
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c901.html
2018/03/23(金) 19:52:45.96ID:e6tCc9HsM
五曜は対応してくれると有り難いかも知れないけど
他はいらんな
2018/03/23(金) 19:55:59.42ID:J4dYcx4H0
>>740
C/C++ のメモリ構造について、になります。
これは基本的な事項で、初級を脱するためにはぜひとも必要な知識なんですが、
そのわりにあまりに解説されることがないような気がします
適切な説明がないものか…
2018/03/23(金) 19:59:40.83ID:J4dYcx4H0
>>740
まず、メモリの管理方法として

1. スタックエリア、に格納するやり方
2. ヒープエリア、に格納するやり方

の大きく分けて二通りがあり、

2. ヒープエリア、二格納するやり方について

2-1. 「静的」:static キーワードを使うやり方
2-1. 「動的」:malloc()/free() または new/delete を使うやり方

が分類されます。
2018/03/23(金) 20:10:28.07ID:e6tCc9HsM
データセグメントって無くなったの?
749デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/23(金) 20:39:25.53ID:COiOJTLla
>>746-747

ありがとうございました。

あまりそういう本はないんですか。

もしかしたら、ヘネシーらのコンピュータのハードの本とか読まないといけないんですかね?

あるいはコンパイラの本ですかね?
2018/03/23(金) 20:40:47.42ID:l1/KZZgNM
>>747
一般的に、静的領域をヒープとは呼ばんだろ
2018/03/23(金) 20:41:24.55ID:qmCr5Czp0
こういうのはネットで覚えたからどういう本に書いてあるかはわからん
2018/03/23(金) 20:45:34.35ID:J4dYcx4H0
>>749
手っ取り早いのは「マシン語」を書いてみる、マシン語(アセンブリ言語)のルーチンを C にリンクさせる、ていうのが王道ですが、
昨今はマシン語のいい教科書がない、という気がします

gcc のインラインアセンブラとかが有望だとは思いますが、まあ簡単にマシン語を記述している教材なんていうものが思いつかない、マシン語の需要というか動機がないのかもしれませんが
2018/03/23(金) 20:46:44.14ID:J4dYcx4H0
>>750
うーむ、たしかに static を「ヒープ」とは言わないかもしれませんね…
2018/03/23(金) 20:47:37.33ID:COiOJTLla
>>752

ありがとうございました。
マシン語の本を探してみます。

>>751

ありがとうございました。
本に書いていない場合には仕方がないのでネットで調べてみることにします。
2018/03/23(金) 22:32:48.28ID:ehYNLgPn0
どうだろ?
C++ の言語仕様的にはオブジェクトの寿命に違いがあるだけで、
それを実現するメカニズムについては詳細な規定があるわけではない。

まずは C++ のパラダイムの中で理解を深めれば自然に理解できるんじゃないの?
手を広げすぎても収集が付かなくなる気もするんだけどなぁ。
2018/03/23(金) 22:56:58.27ID:io4DvPx8a
マシン語に手を出すのは飛躍しすぎだしやめといた方がいい。ある程度C++になれてより深く理解したいと思うようになってからがいいよ。

動的、静的は大雑把に言えば、コンパイル時つまりソースを書いた時点で決まるものを静的、実行時に変化するものを静的と呼ぶ。
変数の型とかメモリ領域の確保の仕方とか、いろんな文脈で使われる。
2018/03/23(金) 22:57:57.59ID:io4DvPx8a
>>756
実行時に変化するのは動的でした
2018/03/23(金) 23:15:38.28ID:g9Gf634nM
>>756
決まる、決まらないの主語は何でしょうか?
2018/03/24(土) 00:54:38.69ID:LvcaB4Q+0
メモリについて知りたいんならC言語から始めたら良い
Unixの移植目的で設計されたC言語は、実行効率のためほとんど必然的にメモリが透けて見える言語になったんである
『プログラミング言語C』という名著もある
これの後ろの方のmalloc()の実装サンプルまで通読したら
シングルCPUの範疇ならメモリについて嫌でもワカル

『プログラミング言語C++』と違って三日もあれば読めれる手頃な分量やしな!
2018/03/24(土) 01:27:57.09ID:eFb1d56B0
>>758
横だが。

何でも、だよ。
型なら静的型、動的型というし、メモリ確保なら静的確保、動的確保という。

マシン語は飛躍しすぎ。
CのエンハンスとしてC++を使うのならマシン語(インラインアセンブラ)もありだが、
C++をJava/C#/C++の並びで使うつもりならインラインアセンブラとか禁止でしょ。

というかそもそもその辺が分からない=全くの初心者がC++からやろうというのが間違い。
PythonかRubyあたりから始めとけ。(どっちも俺は知らんけど)
2018/03/24(土) 01:40:25.62ID:nPxx/G4d0
コンパイラがコンパイル時に決めるものが静的、出来上がったプログラムを実行した時に決まるのが動的
C++だとそういう理解の方がわかりやすいと思う

マクロ、テンプレート、constexpr、リテラル、式や変数や関数やクラスの宣言型なんかは静的
静的なものは全部コンパイラが決めるからプログラムの実行時にはいちいち計算しないし、バグで決められなかったらコンパイラが怒る

変数やインスタンスの中身、関数呼び出し、仮想クラスのオブジェクト型なんかは動的
実行環境や食わせた入力・ファイルなんかに依存するからプログラムを実行してみないと決まらない
動的なバグはコンパイラは感知できないから客先でプログラムを実行するとクラッシュする

適当だけどだいたいこんな感じ
2018/03/24(土) 02:04:25.06ID:eFb1d56B0
細かいようだが、

コンパイル時に確定=静的
実行時に確定=動的(=コンパイル時に確定できない)

で若干の例外(staticとか)があるが大体あってる。

「プログラミング言語C」はやめとけ。名著だが、あれは
「既にプログラミングを出来る人が、C言語を学ぶ」用であって、全くの初心者じゃ読めない。
「プログラミング言語C++」も止めとけ。あれも「既にCを使える人が…」で以下同文。
他本は総じてゴミなのも事実だが。
763デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 02:06:26.05ID:Z79Bg+7E0
特定のアドレスにデータを配置して割り込みかける必要があるからじゃないだろか。
2018/03/24(土) 02:09:36.82ID:nPxx/G4d0
予約語のstaticは転用されまくってわけわからなくなってるので
「静的」とソースコード上のstaticは全く別物だと思った方がいい
2018/03/24(土) 02:15:26.90ID:qYWJwKPe0
その辺整理されないんだろうかね
そう言うものだという説明で
不本意ながら納得する事何十年
2018/03/24(土) 02:29:56.73ID:eFb1d56B0
そんなに混乱するか?例外としてしまって問題ないと思うが。
俺は規格には詳しくないが、(というより色々混ざってしまっているが)

・Cのstatic関数=ファイルスコープに限定、externの反対 --- (A)
 はC++ではなんとかされたのではなかったっけ?(どうせ使わないからどうでもいいが)
・staticクラス、あるいはクラスのstaticメソッド --- (B)
 は「静的」で矛盾しないから、そもそも問題ない。
・関数内static変数でプチグローバル(みたいなやつ) --- (C)
 も普通にクラスにしろ、って話でしかないし、使わないだろ。

結果、普通に使う分には特に混乱しないと思うが。
文法オタクは気にするのかもしれんが。

(C)は「動的関数にしよう」という意図があったのかもしれんが、
結局C/C++の世界は静的関数しかないから、意味無かったし。
というかそもそも俺は動的関数のメリットがよく分からん。
C#は動的関数だが、結局ロード/アンロードはアセンブリ単位=ほぼ起動時に纏めて、
であって、活用してない。
Javaは動的関数でメリットを享受してるんだっけ?(知らんから教えて)
2018/03/24(土) 02:33:41.17ID:y/z0A0hW0
https://ideone.com/Epp30z
お兄ちゃん助けて、コンパイルが通らないの。

VCで開発してます。
jsonのメモリーモデル研究にとりあえずシェアードPTRの組んでそれからやっぱユニークPTRの変更しました。
色々いじってるのですが、意味不明なエラーが出てさっぱりわかりません。
自前のコードなら自分でどうにかするのですが、コードステップするとライブラリの中でえらーおこしててさっぱりです。
どなたかご教示ください。お願いします。
2018/03/24(土) 02:46:21.51ID:nPxx/G4d0
std::vector<UniqueObject>にstd::pair<UniqueObject,UniqueObject>突っ込もうとしてんじゃん
ちゃんとエラーメッセージ読めよ
2018/03/24(土) 02:51:39.38ID:y/z0A0hW0
え?何行目ですか?そんなバカな・・・。え?
2018/03/24(土) 03:47:44.28ID:jOWDr2Es0
static関数は恐らくリンク工程がdynamicの場合があるため
それに対してのstaticなんだろな
771デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 03:55:06.40ID:Z79Bg+7E0
毎回思うんだけど、なんでgccで勉強しようとするんだろうな。
エラーメッセージ読めと言われても読めるわけがない。
一番わかりにくいメッセージを出すコンパイラで勉強する子が不憫でならない。
772デフォルトの名無しさん
垢版 |
2018/03/24(土) 04:28:06.63
>>771
VCで開発って書いてんだろーが
773デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 04:30:46.18ID:Z79Bg+7E0
確かに書いてあるな。
じゃあエラーメッセージ読めよ。
2018/03/24(土) 05:34:00.15ID:GrrVfR010
読む気のない奴は何使ってもダメだという良い例
775デフォルトの名無しさん
垢版 |
2018/03/24(土) 06:12:32.26
いつも大量のWarningが出るのを真面目に対処せず放置してるからErrorが出ても理解できない罠
2018/03/24(土) 06:12:34.93ID:y/z0A0hW0
https://ideone.com/FN5IrI

理屈の一つは多分。
イニシャライザーリストが要素をconstで構築するからmoveできない?
内部でconst_castするわけないしこれ詰んでない?

あるぅぇ〜。なんでじゃー。
2018/03/24(土) 06:25:04.10ID:0qB0BmlJ0
static_castの動作内容は翻訳時に全て確定する
dynamic_castの動作内容は実行時のvtableにより変化する

static_assertは翻訳時に検査を行う
assertは実行時に検査を行う

static link libraryは翻訳時に結合する
dynamic link libraryは実行時に読み込む
2018/03/24(土) 06:57:20.04ID:XPzSeRia0
どうやら >>740 の質問は C++ に限定した話ではないみたいだから、
C と C++ の両方を扱うスレッドに移動するのが良いんじゃないかな。

「Cの場合は…」「ここC++のスレッドだし」レベルの齟齬が避けられるし、
このスレッドを見てないC専門の人が有用な情報を持ってるかも知れん。


【初心者歓迎】C/C++室 Ver.102【環境依存OK】
ttp://mevius.5ch.net/test/read.cgi/tech/1509780815/

スレを勃てるまでもないC/C++の質問はここで 25
ttp://mevius.5ch.net/test/read.cgi/tech/1471100645/
2018/03/24(土) 09:00:52.23ID:eFb1d56B0
>>778
質問者はそれ以前の、プログラミング一般の「静的」「動的」の区別が付いてない。
スレ移動しても意味無い。というかどこのスレでも同じ。

C++のstaticは、Cのグダグダな仕様を引きずっているからおかしくなっているだけで、
C++で新たに設定されたstaticは他言語とも整合取れてる。
これに関しては「Cが悪い」でいいと思うよ。

説明している本が無いのは、そもそもそんなところで引っかからないだろう。
教習所でハイオクの話をしても意味無い。
一通り動く物を組めるようになるまではそれにフォーカスしろ、でいい。
2018/03/24(土) 09:28:18.28ID:nPxx/G4d0
静的動的の区別は大事だし引っかかりやすい所でもあるでしょ
テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ

説明してる本がないって本当か?本当なら世の本がクソすぎる
781デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 10:20:48.01ID:Z79Bg+7E0
で、静的と動的の違いは何なんだよ。
ガンダムで説明してくれ。
2018/03/24(土) 10:26:44.70ID:UtKAK1R90
staticとauto
783デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 10:38:33.14ID:Z79Bg+7E0
ガンダムで説明できないうちは理解できてることにならないぞ。
2018/03/24(土) 10:49:46.91ID:jOWDr2Es0
アインシュタインみたいなこと言ってんじゃねえよ
2018/03/24(土) 11:08:12.95ID:aqtEECgt0
ガンダム言語の表現力を信じろ
2018/03/24(土) 11:10:56.81ID:eFb1d56B0
>>783
じゃあお前が説明しろよ。
お前は馬鹿だから出来ないと思うがな。

そもそも>>763は誰向けのレスだよ?
2018/03/24(土) 11:18:43.16ID:aqtEECgt0
コーディング規約にchar aznable禁止っていうのを見たことあるから
C++にガンダム要素を入れるのはタブー
2018/03/24(土) 11:28:25.89ID:eFb1d56B0
>>780
> テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ
ねえよ

> 説明してる本がないって本当か?本当なら世の本がクソすぎる
世の本は概して糞だ。これは事実だ。

というかここら辺の認識がずれるのは世代ギャップだ。
現状の本を書いてきている世代は全員CをやってからC++をやっている。
だから「静的」「動的」の区別が付かない状態でテンプレートを触ることがなかった。
当然そこを解説した本もそんなにあるはずがない。

お前らの世代がCをやらずにいきなりC++を始め、それで色々苦労した経験があるのなら、
お前らの世代の連中が本を書かなければならない。ただそれ以前に、
俺はその必要(全くの初心者がCをやらずにC++を始める)があるとは思えないが。

入門書を書いている連中はプログラマでも宣教師でもなく、ただのテクニカルライタだ。
だから需要(売れる)があれば書くだけ。今無いのは需要がないと見られているから。
俺もこの見方については同意する。
最初のプログラミング言語がC++ってのは単純に選択を間違えてる。
789デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 11:30:12.41ID:Z79Bg+7E0
C++とJavascript以外学ぶ必要があるとは思えない。
2018/03/24(土) 12:01:13.85ID:3GLZsUhUM
>>789
それはさすがに世間が狭すぎる
土方志望としてもJava程度は触っとけ
791デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 12:18:09.21ID:Z79Bg+7E0
Javaは当初の理念を失ってしまったように感じる。
2018/03/24(土) 12:21:12.10ID:aqtEECgt0
JavaはJVM上で動く一言語に成り下がったからな
2018/03/24(土) 17:03:55.62ID:nPxx/G4d0
今からJavaやるくらいならC#にしとけ
794デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/24(土) 18:05:30.46ID:upExxHyGa
みなさん、ありがとうございました。

カーニハン他の本をまず読んでみようと思います。

>>793

そうなんですか?

Robert SedgewickらのAlgorithmsという教科書がJavaで書かれているため、
Javaの本も買って読んでいます。

ところで、学術的?な本では、オブジェクト指向言語としてC++かJavaが
大抵使われていますが、C#は使われていません。これはマイクロソフト
という一企業が設計した言語だからでしょうか?
2018/03/24(土) 18:06:22.88ID:upExxHyGa
たとえば、プログラミングコンテスト関係の本では大抵C++が使われています。
2018/03/24(土) 18:07:40.93ID:upExxHyGa
そういう理由から、本当はC++ではなくC# + Visual Studioを勉強したいのですが、
C++の本(ロベール)を買って読んでいます。
2018/03/24(土) 18:12:06.94ID:aqtEECgt0
そのうち大抵の言語は経験なくてもリファレンス片手に使えるようになるから好きなもん使え
2018/03/24(土) 18:12:52.16ID:0qB0BmlJ0
C++だって元々はAT&T製なんだが
2018/03/24(土) 18:20:10.81ID:LkK69e8iM
javaも神託に従わないと訴えられるという…
2018/03/24(土) 18:50:18.42ID:eFb1d56B0
>>796
なら素直にC#やっとけ。
その後に必要ならC++で何も問題ない。

C#は商業的につまずいたのでJavaほどの知名度はないが、
言語自体はJavaよりは断然いい。(後発だから当然だが)
2018/03/24(土) 19:07:41.38ID:weQnYJFBd
ねーねー。
STL作った人は、共産主義国で食中毒にあって、ベッドの上で朦朧とした頭で閃いたって話だった気がしたけど、どっかにその話のソースある?
ググっても見つからないよー
2018/03/24(土) 19:12:27.84ID:UtKAK1R90
神託は絶望の淵やタヒぬ直前に見えたりするもんやで
2018/03/24(土) 19:18:50.87ID:LkK69e8iM
>>801
見つけてきたぞ。何処かで発表か何かするの?
http://www.stlport.org/resources/StepanovUSA.html

ところでこのインタビューにあるtamagawa numberってなんだろう
2018/03/24(土) 19:25:16.65ID:upExxHyGa
玉河数

https://ja.wikipedia.org/wiki/%E7%8E%89%E6%B2%B3%E6%81%92%E5%A4%AB

に書いてありました。
2018/03/24(土) 19:30:46.97ID:LkK69e8iM
玉川数じゃ出てこないわけだ
2018/03/25(日) 06:55:48.47ID:FlrNzX5dd
皆様ありがとーございます。
論文の枕で書こうかと思いまして
2018/03/25(日) 11:36:01.08ID:Lywxeunja
char* str = "abc";

とは書かずに、

const char* str = "abc";

と常に書くようにと本に書いてあります。

理由は文字列リテラルは直接書き換えてはいけないからであると書かれています。

●コンパイルは通っても、実行するとエラーになることもある。
●同じ内容の他の文字列リテラルまで書き換えられてしまうことがある。

とも書かれています。

禁止されているにもかかわらず、コンパイルが通る可能性があるというのはどういう
ことなのでしょうか?

(1)コンパイルエラーが発生
(2)コンパイルは通るが実行するとエラーが発生
(3)コンパイルは通り、実行してもエラーが発生しないが、同じ内容の他の文字列
リテラルまで書き換えられてしまうという不具合が起こることがある。

コンパイラーの設計者には、(1)、(2)、(3)の選択肢があるのはなぜでしょうか?

禁止されているのだから、一律にコンパイルエラーにするのが自然に思われます。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
2018/03/25(日) 11:39:58.12ID:Lywxeunja
const char* str = "abc";
const char ca[] = {'a', 'b', 'c', '\0'};

の二つは同じことだと思っていましたが、これは違うということでしょうか?

const char* str = "abc";

では、"abc"をある場所に格納しておき、それを使いまわしたりすることがある
ということでしょうか?

例えば、

const char* str1 = "abc";

const char* str2 = "abc";

と書いたときに、 str1 == str2 になることがあるということでしょうか?

一方、

const char ca1[] = {'a', 'b', 'c', '\0'};
const char ca2[] = {'a', 'b', 'c', '\0'};

と書いた場合には、それぞれ、別に格納場所が確保されるということでしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
2018/03/25(日) 11:41:04.91ID:tMBl9Z88M
>>807
>>469
2018/03/25(日) 11:44:30.72ID:Lywxeunja
すみません。
カーニハンらの本の日本語版のp.127に書いてありました。

char amessage[] = "now is the time";
char *pmessage = "now is the time";

の違いについてです。

そして、文字列の内容を変えようとすると、その結果は不定となる

と書かれいます。なぜ不定としているのかについては理由は書いてありません。
2018/03/25(日) 11:46:43.36ID:Lywxeunja
>>809

ありがとうございました。
故意に違反状態にするということもあるんですね。
正直言って無駄に分かりにくいところがあるんですね。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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