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

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

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

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

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
2017/04/04(火) 19:47:09.26ID:xNF4clmU
>>575
確かに関数プロトタイプは有用だね,これがないと結構ミスるかもしれないね
void を返す関数?int でいいんだよ
2017/04/04(火) 20:27:50.00ID:/PIYb7TP
int funca01(...);
int funca02(...);
int funca03(...);
2017/04/04(火) 23:08:17.42ID:YUY8Mb54
老人は意味とか概念を理解しようとしないから嫌
「bool? intでいいだろ」
「forループ?本質はgotoと同じ」
「enumなんてintでいいだろ」
ホントもう存在が害悪
2017/04/05(水) 00:33:27.19ID:DVg/5L4N
>>550
何が「昔はね」だよw
Qちゃんその当事Cなんて触ってなかったろ?
アンタ最近(たかだか数年?)プログラミングで遊び出しただけの人でしょ
2017/04/05(水) 02:38:54.31ID:ZJf7oEgw
>>579
「static const intなんてenumでいいだろ」
こうですね
2017/04/05(水) 04:30:52.52ID:ni2ET+sb
奴らは#defineだ
2017/04/05(水) 08:14:48.69ID:Bh5NPBNH
マジックナンバー直書きでしょ
2017/04/05(水) 08:19:06.54ID:qVk1sCwA
K&Rだと〜
c89だと〜
過去の異物がまだ現役だと信じて話してけるのがうざい
2017/04/05(水) 09:06:55.68ID:ncDYJBnp
それ言うならC自体が。
いまさらC++と互換性のないCを選ぶ理由がない。
2017/04/05(水) 10:35:04.67ID:k0RY104y
>>585
C++と互換性のないCってどんなの?
2017/04/05(水) 19:40:11.14ID:IM5122PI
ベターC的な所全般だな
範囲forとか2進リテラルとかスレッドライブラリとか参照とか
Cにはnullptrすら無いし細かいところでは条件演算子が右辺値とか
ようするに別言語
オーバーロードに対するtgmathとかもう糞の臭いしかしない
2017/04/05(水) 19:44:22.68ID:bDXscs5n
>>585
たしかに,C99 の数々の改悪は C++ との互換性を考慮していない悪手の連発,ほとほと困ってしまう

>>584
C++ とほどほどの交換性のある C89 が最良だよ
2017/04/05(水) 19:46:32.21ID:bDXscs5n
>>580
「K&R1 は構造体は基本的にポインタでしか扱えない」制限なんて,使ってもいなかったらわからないだろう?
590580
垢版 |
2017/04/05(水) 20:02:06.85ID:DVg/5L4N
え?Qちゃんてサンデープログラマじゃないの?
職業プログラマでもないし
プログラミング暦せいぜい10年未満だと思ってた
2017/04/05(水) 20:07:28.87ID:bDXscs5n
>>579
>「forループ?本質はgotoと同じ」
そんなことはいわないとおもうよ,K&R1 の時代から for はあるしね
きがつくと for(;;) { } と break だけで書いてたりするのはあるかもね,while 使いにくいとか,do while なんかマクロの中でしかつかわない,とかさ

enum?
#define でいいとおもうよ‥
2017/04/05(水) 20:08:45.69ID:bDXscs5n
>>590
サンデーだよ
でも長いサンデーなんだ‥
2017/04/05(水) 21:26:45.75ID:Kw8eDt7v
ニートじゃ分からんことも多いのでは
2017/04/05(水) 22:05:58.72ID:bDXscs5n
たしかにそのとおりだが,K&R2 = C89 こそ必要十分,ということはわかるよ
2017/04/05(水) 22:10:26.67ID:mGFW5fgT
そういうこと言ってるとそのうち技術についていけなくなるよ
2017/04/05(水) 22:22:23.34ID:ncDYJBnp
C99やC11って、新しい技術とかそういうんじゃないじゃん。
2017/04/05(水) 22:40:44.77ID:mGFW5fgT
規格
2017/04/06(木) 10:47:58.81ID:jz0x7tjm
企画ものは好きじゃないからな
2017/04/06(木) 16:35:26.64ID:w+UX2Wix
ころころ変わるんだから最新もクソも無いわけだが

pakomamaはガチらしいな
2017/04/06(木) 20:02:44.92ID:Uar4T1Gl
>>595
別についていけなくてもいいよ,その殆どは自分には要らないものだから
それはそうと,これは!とおもう新しい技術って最近はどんなものがあるの?
2017/04/06(木) 20:16:13.94ID:kFToYptL
まず、C#のasyncだのawaitだのはC++にも欲しいところ
というか、取り入れる方向で議論していたような
どのみちQZには使いこなせない機能だから知らなくてもよいけど
知れば発狂することだろう
2017/04/06(木) 20:21:15.74ID:Uar4T1Gl
まずC#をやらないとね‥でも Java に走ってしまった‥Java に同じようなのはないの?
603デフォルトの名無しさん
垢版 |
2017/04/06(木) 22:33:11.66ID:Ao1zg6OQ
>>601
coroutineの事なら根本的な所が違うから勘違いしないようにな
2017/04/07(金) 20:08:34.35ID:cdWiLUH2
馬鹿の特長:目的/機能の違いと実現するための実装の違いの区別がつかない
2017/04/08(土) 12:56:12.29ID:TFmwEDa6
C#のawaitはGUIのスレッドを意識出来るので有用だが
C++のawaitはただ裏で走らせるだけの機能的には劣化版な気がしてならない
2017/04/08(土) 13:14:20.88ID:bfo0YVHI
>>605
c++で標準的なgui使うとすると何になるの?
2017/04/08(土) 13:49:52.49ID:xnWSKOe7
>>605
そりゃ C++ と C# のポリシーの違いだろ
2017/04/09(日) 22:32:13.26ID:nTEmq1X3
C使ってる人で変数宣言を途中に書く人いる?
やめた方がいい?
2017/04/09(日) 23:00:21.55ID:gthRNL4S
むしろそうして欲しいかな
勿論ブロックスコープは意識してる前提で
2017/04/14(金) 09:11:56.63ID:ezi5K97R
初期のCはブロック先頭しかコンパイルが通らない
コンストラクタも型推論もないのに途中に置くメリットが少ない
初期化漏れというモンスターの隠れ家になりやすい
2017/04/14(金) 10:33:55.73ID:L6e5ZQwW
一応Cで書くときは関数ブロック直後に書いてるけど、それはそれでforで使うiとかを使い回す事になるから、C++みたくプログラマの良識を信じて(ブロックを意識して変数宣言すると信じて)、好きな場所で宣言出来た方が正解なんだろうな。
2017/04/14(金) 10:35:17.63ID:L6e5ZQwW
出来た方がと言うか、今は出来るんだから、した方が正解に訂正。
2017/04/14(金) 12:59:25.70ID:Hdztr2ik
出来ることと乱用していいことはイコールでない
一瞬だけの一時変数を直前で宣言するのならありだけど
関数全体で使うなら頭で宣言すべきだし、そもそも中間で宣言するような長い関数は
短くなるよう見直すべき
2017/04/14(金) 13:04:43.28ID:xSRtCFhF
魔法の言葉
ケースバイケース
2017/04/14(金) 19:32:18.15ID:UiWlchtO
スコープは可能な限り狭く

おじいちゃんの遺言
2017/04/14(金) 19:38:55.23ID:PNQsiXg9
初期化漏れはブロック先頭でしかかけない方が起こしやすいだろう

長い範囲で使う変数でも、変数ははじめて使うところで宣言した方が分かりやすいしバグも減る。
2017/04/14(金) 20:04:35.98ID:Z/bjVn5R
初期化忘れ防止はどこで宣言したってあんま関係ないというか
大差ないだろうな実際
必要になった時点で宣言するってことでよいと思う
さもないと上手くいかない場合もあるし
いちいち使いもしない「ダミーの値」で初期化するのは馬鹿らしいし
余計にバグりそう
2017/04/14(金) 20:13:31.25ID:Z/bjVn5R
auto result = func();
まぁこういう風にしたいわな

int result = 0;
・・・
result = func();
↑その「0」って初期化値は何なんですか、何を意味した「0」なんですか
では0の代わりに1で初期化したらどうなるんですか
この初期化値の意味は一体何なんですか
ってことになるしな
結局「0」とか「1」とかの初期化値はダミーでありプログラム上なんの意味もなかったりするし
逆に初期化値に意味がある場合もあるから余計にややこしくなる
bool flag = false;
if( func() )
{
  flag = true;
}
これらを区別したいから必要になった個所で宣言に一票
2017/04/14(金) 21:45:43.28ID:spQE74XB
老人の「昔は良かった」を見て顔真っ赤にして論破しようとマジレス
みっともない
2017/04/14(金) 23:47:26.34ID:9eRQSDOY
必要なものを必要なときに宣言する
それだけの話
2017/04/15(土) 09:16:54.52ID:RtikNDCG
>>618
>この初期化値の意味は一体何なんですかってことになるしな

勝手に無駄な初期化しておいてどれだけ頭が悪いんだぜ
ぜんぜややこしくない
お前が馬鹿なだけ
2017/04/15(土) 09:26:22.77ID:Af1/s0zG
もともとが
初期化忘れを防ぐためには関数の先頭で宣言〜
への反論だったからだぜ
2017/04/15(土) 09:41:32.48ID:RtikNDCG
>622
日本語もわからないチンパンは無理して
コンピュータ使わなくても
祖国でオナニーしてればいいんだぜ
2017/04/15(土) 09:50:31.14ID:Af1/s0zG
君の疑問がどこにあるのか本当にわからないからどうでもよい
2017/04/15(土) 10:02:51.76ID:Af1/s0zG
それでもヒントとして>>610への反論だったということだけは言っておこうか
「途中で宣言すると初期化もれしやすい」という風なことが書いてあるが
逆に>>610は何故、先頭で宣言したら初期化漏れしにくい、と考えたか
どういったコードを想定しているかってことだな
要するに>>610はブロックや関数の先頭だけ見れば初期化漏れしていることが直ぐわかると便利だね
って言いたいんだろうけど、それはどういうコーディングルールの元に言えることか
ということだな
2017/04/16(日) 17:51:30.33ID:3PeEvH/A
for(int i = ...; ; ) が書けるようになったのは素直にありがたいな,と感じている
2017/04/23(日) 23:52:45.18ID:IUq/7GPJ
>>626
脳の進化が20年前で止まったチンパンはc89でも使ってろ
2017/04/24(月) 20:45:20.10ID:et30sNFg
うきー
2017/04/25(火) 04:20:41.84ID:Vqnsayjn
>>627
C99 or later で便利になったことなんて,そんなにないんだよね‥
2017/04/25(火) 06:08:12.88ID:X14wy5zc
数値計算とか特殊用途なライブラリ追加ってイメージ。
そりゃ、手間の割に汎用性がなかったら対応コンパイラも出てこないわ。
2017/04/25(火) 22:55:58.60ID:EbISA0IE
インライン関数も行コメントもboolもrestrict も無しで
どうやってプログラム書いてんのか想像もつかない
snprintf無しとか無理ゲーだろ
2017/04/26(水) 02:18:40.34ID:Kw1ZNGm3
restrict無しが想像つかないってどういうことだろ
2017/04/26(水) 09:07:13.88ID:bRGeq+mw
restrict使ったことないなあ
大きく最適化されるの?
2017/04/26(水) 09:13:52.17ID:rDz6/6sg
最適化はあんま気にしてなくて意味的なものかな
memcpyとmemmoveみたいな
2017/04/26(水) 09:20:57.15ID:A4NmaPdj
そう言う機能はメーカー独自実装でC99決まるずっと前からスタンダードだったから、C99って実感が無い。。。
2017/04/26(水) 11:36:23.97ID:O9yeoh6Z
>>631
いやいやそれはさすがに想像力足りなくね?

snprintf無しは無理ゲーなのは同意するが
2017/05/05(金) 00:51:04.53ID:evlI6rq7
void func(hoge)
int hoge;
{}
こんな書き方があったん?
2017/05/05(金) 01:30:10.63ID:PzvORh1V
>>637
詳しくは k&r style とかでググればいいけど今時知る必要はほぼないと思う
2017/05/05(金) 15:05:47.25ID:9iyukdGg
K&R1 だね、引数の型チェックができないから不便かつミスを誘発しやすい
2017/05/07(日) 00:55:58.17ID:uDdo3knt
使われなくなった過去の異物に優劣語り出すとか
老人やべーな
2017/05/07(日) 00:58:01.39ID:gTai4K61
×異物
○遺物
2017/05/07(日) 01:41:21.28ID:zkvqzaCu
誰も優を語ってない訳だが
2017/05/07(日) 15:54:40.58ID:s2OM55fz
ストラウストラップの本って読む価値ありますか?
2017/05/07(日) 22:28:38.36ID:fUCVOwEA
著書全般の基本的な傾向としては万人向けの価値はない
物事の意味や本質を学び考え悩み理解しようとする人向けの本であって
うわべだけの丸暗記やコピペで即結論や結果を求める人向けの本ではないから
2017/05/07(日) 22:36:06.44ID:f9jMnLHr
読む価値はあるが嘘が多いので騙されない注意が必要
2017/05/07(日) 23:30:36.93ID:s2OM55fz
>>644
>>645
上級者向けの本みたいなので
買うのは先に延ばしたいと思います...
一冊高いのもありますが
サンクスです
2017/05/19(金) 15:26:03.09ID:49hF9eg/
はぁ〜〜〜〜
安易にC++に手を出すんじゃなかった
2017/05/20(土) 12:15:32.26ID:Niypv3FQ
変人や御用達の言語だからな
馬鹿のくせにプライド高い老害しか使ってないイメージ
2017/05/20(土) 12:51:51.67ID:Nls5mnQ9
>>648
その手の人らの声が大きいだけだよ。特にこんなところでは。
2017/05/20(土) 18:23:23.08ID:PYbACk+S
みんな黙ってC++だよ
2017/05/23(火) 00:42:13.85ID:9/IkIyOw
ちょっとした確認なんだけどさ、
デストラクタが空っぽ (デフォルトデストラクタ) でもオブジェクトを後始末するための何らかの処理はするよね?

よくあるスライシングの問題で、

・クラス A をクラス B が継承している
・クラス A のデストラクタは virtual が付いていない
・クラス B のデストラクタはデフォルトデストラクタ
・クラス B はメンバ変数を持っていない
・B* を A* にキャストしたものを delete

という状況だと見かけ上はクラス B のオブジェクトには後始末すべきものは何もないように見えるけど、
デストラクタが呼ばれないのはやっぱあかんよな?
2017/05/23(火) 04:48:39.03ID:pt6Ia/HA
うん
2017/05/23(火) 09:20:18.86ID:J4YcG+3k
>>651
はい
規格上もデストラクタがvirtualでないBのオブジェクトをA*に入れてdeleteした場合未定義動作だよ
2017/05/23(火) 10:48:08.30ID:Ip/q9ayQ
未定義動作多すぎだなこの言語。
よくここまで生き残れたな。
2017/05/23(火) 11:01:35.25ID:3W0XlzKr
未定義部分を各社が好きに定義してたからね。
VC++だとこう動くけど、g++だとこう動く、みたいな。
656デフォルトの名無しさん
垢版 |
2017/05/23(火) 12:45:18.14ID:hcbwXZ+h
>>653
横からだけど、それまじ?
出来れば、規格で書かれてる場所教えて欲しい。

不安に思いながらも、一個作っちゃったんだよな…
動作確認済みだから、直ちに問題があるわけではないんだけど、未定義と聞くと将来的には修正しておきたい…
2017/05/23(火) 13:25:39.67ID:I6yYOIGb
>規格で書かれてる場所教えて欲しい

delete式の説明の最初のページに書かれていることが探せないというのは
場所を教えられたところでそもそも規格を保有していないのではないか
2017/05/23(火) 13:25:57.75ID:YY4qnA2y
>>656
意図して作ったの?バグじゃなくて?
2017/05/23(火) 15:16:19.75ID:0tdmeFKn
htmlとその解釈に悩まされるよりはマシ
660653
垢版 |
2017/05/23(火) 15:21:53.55ID:Ek6JChT/
>>656
俺もworking draftしかないけどn3690の5.3.5の3段落目

In the first alternative (delete object), if the static type of the object to be deleted is different from its
dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the
static type shall have a virtual destructor or the behavior is undefined.
2017/05/23(火) 17:00:54.34ID:EZJXMIkJ
C++があまりに不安な要素をたくさん抱えているお陰で未だに新生言語が多数出てくると
思えばいいじゃん?
2017/05/23(火) 19:47:58.75ID:rsJqfxq0
継承すんなよ
663デフォルトの名無しさん
垢版 |
2017/05/24(水) 00:55:48.61ID:WEdzXALv
>>658
意図して作った。
悪しき方法とは思いつつも、stringクラスにsprintf 的な機能のメンバ関数作ったった。
その時、stringクラスの全機能を実装するのがめんどくさかったんで public 継承で。
メモリレイアウトは一切変わらない事を見切った上でだが、未定義だとすると…ヤベ。
664デフォルトの名無しさん
垢版 |
2017/05/24(水) 00:56:49.58ID:WEdzXALv
ん、まあ、deleteは使わないからセーフか?
665デフォルトの名無しさん
垢版 |
2017/05/24(水) 01:00:58.95ID:WEdzXALv
>>657
ドラフトしか持ってない…
delete 使う事は頭になかったから気付かなかった。
ありがとう。

>>660
おぉ、ピンポイント情報あざす。早速確認してみる。
2017/05/24(水) 12:01:47.91ID:/RGvDc8r
メモリレイアウトが変わらない範囲で既存のクラスを再オープンして機能を追加する方法の提案だけは出てたような気がする。
2017/05/24(水) 12:06:31.74ID:/RGvDc8r
>>663
例外関連のなんたらかんたらの処理 (stack unwinding) がかかわってくるんじゃなかったっけ。
正常系では普通に動いているように見えても何がどうなってるかわからんぞ
2017/05/24(水) 13:51:37.65ID:OqDgfclu
>>658の話の場合、別に”string *のポインタで”継承したやつをdeleteしない限り大丈夫でしょ
>>651で言うところの
・B* を A* にキャストしたものを delete
これが問題になるんであって

B*からdeleteして中身もBなら問題にならないと思うけど
2017/05/24(水) 14:15:44.36ID:ttKQmf2U
>>668
std::vector<std::string>に入れたら死ぬってことだよね??
2017/05/24(水) 14:47:39.17ID:/RGvDc8r
>>669
ポインタを std::string* に入れてなおかつそれを std::string* のままで delete したらあかんという話。
値を std::string にキャストする分にはなにも問題はない。
2017/05/24(水) 15:58:36.11ID:ttKQmf2U
>>670
だからstd::vector<std::string>にいれらんないよね?
2017/05/24(水) 17:02:32.05ID:/RGvDc8r
>>671
何を言いたいのかよくわからんが……。
std::string を継承した型は、レイアウトが変わらないようにしたからと言って (キャストなしで) std::string には入らないよ。
言いたいことを具体的にコードで示してくれんか
2017/06/03(土) 20:46:07.15ID:/cDPk3Lb
>>672
http://ideone.com/akrJQA
674デフォルトの名無しさん
垢版 |
2017/06/04(日) 05:01:25.52ID:a4MXR2y0
テンプレート構造体を作りその配列をクラスのメンバに含めたいのですが上手くいきません。

作りたいクラスはスタックとして使えるもので、
主な作りたいメンバは、二つの型のメンバ変数を持つ上記のテンプレート構造体の配列。
引数としてテンプレート構造体を持ち、上記の配列に順次プッシュしていく関数。
最後にプッシュされた構造体をポップする関数、という3つです。

どのようにすればテンプレート構造体をクラスのメンバにすることが出来るのでしょうか?
もしくは、このような機能を持つクラスを実装するためにはどうすればいいのでしょうか?
よろしくお願いします。
2017/06/04(日) 08:23:07.29ID:7To+hzFq
まず
using テンプレート構造体の型 = 構造体テンプレート<型パラメーター>;
をします
2017/06/04(日) 11:02:02.70ID:4s9JqZC9
>>674
http://ideon.com/EmULAG
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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