【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/07/18(火) 07:07:27.20ID:vzMDiUgd
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/
2017/07/18(火) 15:31:46.97ID:PYVrHLeZ
ほす
2017/07/18(火) 18:40:03.50ID:R/mOsefM
まさか短時間に20レスしないと落ちる?
2017/07/18(火) 19:38:57.23ID:u0V8o5mb
そんなことで落ちるならレス数一桁のスレが大量に残ってるわけないだろ
5デフォルトの名無しさん
垢版 |
2017/07/20(木) 23:03:44.79ID:kpkY/QGw
右辺値参照がネットのどの記事をみてもわからないので書籍に手を出して見ようと思います
右辺値参照についてをわかりやすく取り扱ってる参考書籍があれば教えてください
2017/07/20(木) 23:51:51.38ID:z9hoJ4wh
ネットで探して出てくるいつもの説明が一番マシではないかという気がしてならない
7デフォルトの名無しさん
垢版 |
2017/07/21(金) 00:25:40.36ID:cbDQlmdo
・見分け方
lvalueは、名前がある
rvalueは、名前がない
・rvalueの特徴
名前がないということは使い捨ての一時的なオブジェクトだから、処理が終わったら捨てられる
・使い分けの理由
代入演算子(=)や、関数の戻り値に使う時や、vectorなどのコンテナに放り込む時には、
一旦オブジェクトがコピーされるが、rvalueだと分かっていたら、勝手にmoveしてくれるので処理が速い
特に、でかいデータを持った独自のクラスの場合にコピーよりmoveが速くなる
この機能を使いたかったら、クラスのmoveコンストラクタとmove代入演算子(=)を定義しておくこと
でも、それは面倒だろうから、ある条件を満たしたらコンパイラが勝手に作ってくれる
・条件
独自クラスに次のいずれの定義もしていないこと
a) コピーコンストラクタ
b) コピー代入演算子
c) デストラクタ

C++歴1ヶ月の俺が答えてみるテスト
8デフォルトの名無しさん
垢版 |
2017/07/21(金) 00:50:30.03ID:cbDQlmdo
moveコンストラクタを作ったら気づくと思うが、処理内容は結局コピーコンストラクタと同じなわけ
とどのつまり、ポインタをメンバーに持ったクラスを定義する時に有効なんだよ
コピーコンストラクタ(lvalue)だと、コピー元は存在し続ける可能性があるから、
必ず1から全データを作り直して、ポインターのポイント先を新データにしないといけない
でも、rvalueで捨ててもいいデータだと分かっていたら、捨てるデータを捨てずにそのまま使って
ポインタのポイント先をその捨てるデータにすればよいから、楽で速いよねという話
2017/07/21(金) 00:56:26.30ID:joLx1qFD
右辺値参照なら
https://srad.jp/~taro-nishino/journal/507551/
が一番わかりやすい
これ読んでわからなかったらまだ手を出すのが早すぎたと思って諦めたほうが良い
本を買っても無駄な出費になるだろう
そして↑のページを見つけるのに検索してて出てきたのが↓
https://woorex.com/06_yahari/1994_01.html
で、全然読んでないが、こういった文章に価値はないと思う
ネットの文章のすべてに価値があるわけではないと思ったわ
2017/07/21(金) 01:02:33.71ID:joLx1qFD
>>8
いや多分そういうことじゃなくて、分からないのはC++の文法的なトリックの部分に関してだと思う
右辺値参照として宣言した変数を参照したら左辺値になるとか
なかなかにクラクラする部分もあるので
11デフォルトの名無しさん
垢版 |
2017/07/21(金) 01:04:55.21ID:kH4Xa8wr
みなさんありがとうございます
取り敢えず>>7>>8さんのレスを参考に
>>9さんのURLを見て寝ようと思います
迅速な回答ありがとうございました (^○^)
12デフォルトの名無しさん
垢版 |
2017/07/21(金) 01:15:36.94ID:uK7tgvol
まぁ、あれだよね。
右辺値と右辺値参照の違いを理解できるとスッキリするんだけどね。
2017/07/21(金) 02:26:47.25ID:9vgFXXAq
>右辺値と右辺値参照の違いを
>>9のURL先の説明を書いた低能に100回読ませたい
まずこの違いを明確に理解しないと>>7の様なおかしな説明になってしまう
14デフォルトの名無しさん
垢版 |
2017/07/21(金) 02:39:34.56ID:cbDQlmdo
使う目的が違うの?
15デフォルトの名無しさん
垢版 |
2017/07/21(金) 02:47:35.89ID:cbDQlmdo
俺の理解では、moveしたいからそのためにmoveができる条件を定義してるだけだと思うけど
コンパイラーがどういう条件の時に右辺値と扱えるかどうかを示すために
それが、参照に&マークを使っているという歴史的経緯でややこしくなってるだけでしょ
2017/07/21(金) 02:51:29.22ID:joLx1qFD
まずもって
> lvalueは、名前がある
> rvalueは、名前がない
がおかしいということでは?
2017/07/21(金) 07:39:48.91ID:9vgFXXAq
そうだな
「lvalueは、名前がある」という誤った知識を注入されていることもあるが
右辺値(rvalue)についての説明が始まって最後まで右辺値参照の話が無いのは良くないな
18デフォルトの名無しさん
垢版 |
2017/07/21(金) 07:46:07.93ID:cbDQlmdo
レベルの低いスレだな
19デフォルトの名無しさん
垢版 |
2017/07/21(金) 07:53:53.57ID:cbDQlmdo
お勧め本の提示ができないばかりか、自分の言葉で説明もできずにただただ罵るだけ
突っ込まれると粗探しをし始める
まぁ、本当に理解してる人間がこんなスレ覗く暇ないわな
2017/07/21(金) 08:31:50.37ID:9vgFXXAq
>>15
>参照に&マークを使っているという歴史的経緯でややこしくなってるだけでしょ
&は昔からあるのに、そうなのだろうか。
どちらかというと右辺値・左辺値が右辺値参照・左辺値参照と直交する概念で、
言葉が似ているのに>>10の例にもあるように「右辺値参照かつ左辺値が同時に成り立つ」ことが原因だと思うのだが
2017/07/21(金) 08:43:30.27ID:xjFWQMIy
>>19
> お勧め本の提示ができない
>>9の最初のリンクで充分だろ
自分の言葉でとか言うがそこそこ大きな概念だから説明がまともだったとしてもこんなところでとうとうと説明されても困るし>>7-8みたいな中途半端な説明は有害なだけだし
2017/07/21(金) 09:09:12.41ID:F3uzVYNc
他の言語ではこの概念出てこないの?どこが違うの?
2017/07/21(金) 10:43:02.49ID:YiUdVm2o
他言語では見たことが無いな
参照の仕組みが近いのはC#だと思うが右辺値参照の概念は無い

static int X;
static ref int M() { return ref X; }
static void Main () {
 M() = 100;//「M()」実質の左辺値
 ref int x = ref M();//「ref M()」実質の左辺値
 ref int rx = ref x;
 rx++;
 Console.Write(M());//「M()」実質の右辺値
}
2017/07/21(金) 11:42:16.76ID:joLx1qFD
他言語では代入演算子でオブジェクトをコピーしたり
まるでオブジェクトを基本型であるかのようにふるまわせる概念が無いからな
なぜなら他言語にはGCが有るからね
GCがあって、オブジェクトは常にnewして使うから
勝手にディープコピーされるとか、そういうことは考える必要がないね
逆にC++はGCが無いから・・・

もしC#で右辺値参照があり得るとしたらstructに関してだが
C#のstructはmoveセマンティクスが必要であるような用途に使うものではないから
やっぱり要らないな
2017/07/21(金) 11:52:40.57ID:XYgV/slE
GCがあるから委譲と複製を区別しなくて済むってのに違和感
26デフォルトの名無しさん
垢版 |
2017/07/21(金) 12:22:05.32ID:C+EZcupv
1==1 の結果が 2でも-1でもなく 1 だってのは
仕様書のどこに書いてありますか?
2017/07/21(金) 12:25:57.68ID:joLx1qFD
他言語は普通に代入などすれば、基本型はコピーでオブジェクトは委譲だ
C++は普通に代入などすれば、基本型もオブジェクトもコピーだ
で、メタプログラミングの観点から見て、何が起こるかということだな
C++は無駄なディープコピーが発生しやすい仕様なのだわ

C++もnewすれば他言語と同じになるが、GCが無いので常に有効ではない
やはりナマポはクラスでラップして・・・って事になるので
適切にコピーなりmoveなり寿命管理してもらわないと破綻する
2017/07/21(金) 12:37:14.45ID:YiUdVm2o
>>26
ほれ
ISO/IEC 9899:2011 6.5.9p3
Each of the operators yields 1 if the specified relation is true and 0 if it is false. The result has type int.
2017/07/21(金) 13:04:34.65ID:C+EZcupv
>>28
おっ サンキュー

これC11っぽいけど、C89でもおんなじだよな?
2017/07/21(金) 13:30:56.58ID:YiUdVm2o
>>29
残念ながら2011より前の規格は知らぬ
2017/07/21(金) 13:49:35.62ID:JOiJxqKd
C99は同じ節の同じ段落にある。
C89は不明だが、もしそんな基本部分が変化してたら大騒ぎになってたはずなので同じだろう。
2017/07/21(金) 13:54:13.46ID:YiUdVm2o
>>29
89と内容等価ということになっているANSI/ISO C90を入手した
6.3.9(==,!=)は6.3.8(大小比較)を参照していてそこには
yields 1 if the specified relation is true
とある
つまり1になる
2017/07/21(金) 15:17:08.56ID:P7F/0MU3
>>9
横からだけど、すごく分かりやすかった。ありがたい。
2017/07/21(金) 19:19:00.46ID:6hIUsyMM
>>24
GC 関係ないわな

> 勝手にディープコピーされるとか、そういうことは考える必要がないね

> C#のstructはmoveセマンティクスが必要であるような用途に使うものではないから

なぜか自信満々で頓珍漢な思い込みを披露されてもな
2017/07/22(土) 01:20:33.15ID:oqulLxLp
into sokuに1か2以外を入力したとき1か2を入力されるまでループさせるのをやってみたいんですが
scanf("%d", &soku);
while (soku != (1 || 2)) {
printf("もう一度入力してください。\n希望する 1\n希望しない 2\n");
scanf("%d", &soku);
}
こう書くと2を入力してもループしてしまいます。
1か2が入力されたらループを抜けるにはどう書けばいいんでしょうか?
2017/07/22(土) 01:34:09.94ID:Scnyb+6Y
soku != 1 && soku != 2
2017/07/22(土) 01:36:10.92ID:oqulLxLp
>>36
できました。そういう風に書くんですね。ありがとうございました。
2017/07/22(土) 01:38:48.73ID:aL/Y+CP+
()が強いので1||2が先に計算されて1になってしまう。
2017/07/22(土) 01:40:28.07ID:ewNbHc5x
!(soku == 1 || soku == 2)     (1 または 2 )ではない
⇒ soku != 1 && soku != 2   1ではない かつ 2ではない
2017/07/22(土) 01:47:45.17ID:oqulLxLp
いろんな書き方もできるんですね!
勉強になります。ありがとうございます。
2017/07/22(土) 06:19:41.71ID:RRuLA+SK
C++1zでかっこよく書けるようになる。
そう思っていた時期がありました
2017/07/22(土) 07:13:43.26ID:Sw3YC1YO
>>39-40
この理屈はド・モルガンの定理って名前がついてるやつ。
2017/07/22(土) 14:34:43.25ID:9V10kE5p
>>38
なんで3じゃなく1になるの?
2017/07/22(土) 14:51:10.38ID:ewNbHc5x
>>43
ビット演算のor ではなく、真偽判定の論理和なので
1の真偽を求めて真 ⇒ 1
(2の真偽を求めて真 ⇒ 1 : or 結合のショートサーキットで判定しなけど便宜的に)
こうなる
2017/07/22(土) 14:51:24.55ID:o3Mfi2ju
1|2なら3
1||2は1
2017/07/22(土) 15:12:08.99ID:9V10kE5p
難しいのね…
2017/07/22(土) 18:27:01.28ID:Yr9CVNZl
>>42
いつも不思議に思うのだが、このド・モルガンは議論のスタートとなる公理なの?
それとも、なんらかの公理から導かれる定理なの?
教科書の最初の方でカップハットをやらされる度に思う疑問です
2017/07/22(土) 18:39:33.61ID:WTRjQogU
>>47
定理って言ってるんだから、定理だろ。
ベン図と真理値表で簡単に証明可能。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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