[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/13 10:33 / Filesize : 185 KB / Number-of Response : 779
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part66



1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part65
pc11.2ch.net/test/read.cgi/tech/1230341243/

128 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 10:47:27 ]
>>127
std::sortに渡すコンパレータは辻褄のあった結果を返さないといけないと仕様で決められている。
そうでない場合の動作は未定義。
つまり、でたらめな結果を返す可能性のあるコンパレータはstd::sortには使えない。

ソート関数を自作するか、コンパレータを検証する関数を追加するしかないだろうね。
いずれにしても矛盾を検知しようと思ったら、O(n log n)では済まないと思う。

129 名前:デフォルトの名無しさん [2009/03/20(金) 16:49:42 ]
c++で作られたプログラムを逆アセンブルしてるんですが、アセンブリ言語について質問できるスレってありませんか?

130 名前:デフォルトの名無しさん [2009/03/20(金) 17:16:32 ]
このへんじゃね?
pc11.2ch.net/test/read.cgi/tech/1172916032/

131 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 17:20:20 ]
C++で書かれたプログラムを逆アセ出来る人ってすごいなぁ。
意味不明じゃね?

132 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 17:30:16 ]
逆アセするならそもそもアセンブラ理解しないと・・・。
80x86系統の命令コード表あると思うからそれ見ながら分解していけばいいかと

後単純なプログラムでコードがどうなるかをチェックし続けるっていうのが解析の基本><

133 名前:デフォルトの名無しさん [2009/03/20(金) 17:34:18 ]
>>130
ありがとうございました。

>>131
IDA pro とか簡単に逆アセンブルしてくれて、しかもグラフィカルに構造を表示してくれるので
あんまり知識が無くてもなんとなく分かります
しかも無料で使えるし。
ソフト自体が英語だしあんまり解説サイトとかが無いのが辛いですが・・。

134 名前:131 mailto:sage [2009/03/20(金) 19:47:12 ]
IDA proってすげーー


135 名前:デフォルトの名無しさん [2009/03/20(金) 19:56:39 ]
引数オーバーロードによって戻り値を変えるプログラムが
g++ (1)3.3.6と(2)4.2.4で挙動が違います。
実行後 main戻り値が (1) => 2 / (2) => 1 となります。
NS1をNS2に書き換えると両方とも2が戻ります。
どっちの挙動が標準規格的には正しいですか?

//以下そのプログラム
#include <stdio.h>

namespace NS1 {
  struct HUGA {};
}

namespace NS2 {
  int get(...) { return 1; }
  
  template <typename T>
  int f() {
    NS1::HUGA huga;
    return get(&huga);
  }

  int get(NS1::HUGA * ) { return 2; }
}

int main() { return NS2::f<int>(); }


136 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 20:01:56 ]
うーん。もしかして、Cのソースがあるものなら、直接アセンブラソース吐かせれば良いんじゃね?
バイナリを解析したいのならスマソ。



137 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 20:32:04 ]
>>135
1

138 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 20:43:39 ]
>>135
2


139 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 20:44:56 ]
Visual C++2008では 2 になったけど
実際の動作は1にならないといけないみたいね。
vararg は言語によるすべての型チェックを無効にして
常にもっとも一致した型であることを強制するので
多重定義の解決では自動的に最優先になるみたい。

140 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 20:50:00 ]
俺も気になってやってみた。
g++ (GCC) 3.4.5 (mingw special)では返り値は1で、
Borland C++ 5.5.1 for Win32では返り値は2だった。

…つまりg++ 4.2.4はちゃんと正しい進化を遂げているということか。

141 名前:133 [2009/03/20(金) 20:54:37 ]
>>136
がっつりexeファイルです。
コマンドプロンプトで動く簡単(そう)なコンパイラがあるので、それを解析してデコンパイラを作ってみたくて・・。
にしても、2ちゃんねるのスレッド検索って、「アセンブラ」とか「アセンブリ」で検索すると結果が出るのに、
「アセンブ」で検索すると出ないんですね。ふしぎ!

142 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:02:36 ]
(...)の絡む名前解決の定義ってISO/IEC 14882:2003にあるの?
もしなければ現段階では鼻から悪魔ってことになっちゃうんだけど

143 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:21:21 ]
よこから質問なんですが
(...)
ってどうつかうんですか?
void func(int n, ...)
みたいのであればstdarg.hのマクロでやるのとは思うんですが
(...)みたいな...のみとはなんなんなんですか?

144 名前:135 mailto:sage [2009/03/20(金) 21:37:44 ]
試してくれた人ありがとうございます。

>>139
...をvoid*にしても(2)はやっぱり1です。

ちなみにfの定義を非templateにすると両方とも
1になります。template関数が実体化されるときに
初めてオーバーロードの解決を行うっていう理屈で
あれば(1)が正しいような気もします。
ただそれはあまりにもマクロ的な発想だし(2)が
正しい?

NS1をNS2を書きかえると(2)が2に成るのも謎・・・。

145 名前:デフォルトの名無しさん [2009/03/20(金) 23:05:11 ]
page4.auctions.yahoo.co.jp/jp/auction/d91264064

146 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:58:20 ]
>142
もちろんある。
っていうか、SFINAE を使う場合に用いられる場合がある。
>139
そして ... のオーバーロード解決の優先度は最低だ。
>常にもっとも一致した型であることを強制するので
これで優先されるのは関数テンプレートの時。

>144
> template関数が実体化されるときに
> 初めてオーバーロードの解決を行うっていう理屈で
> あれば(1)が正しいような気もします。
two phase lookup でぐぐれ。
dependent name の名前解決は実体化時まで遅延される。
nondependent name の名前解決は通常通り行われる。
get(&huga) は nondependent name なので名前解決は
通常通り行われ、この場合は get(...) に解決されるはず。

> 14882:2003
> 14.6 Name resolution/9
> If a name does not depend on a template-parameter (as defined in 14.6.2), a declaration (or set of declarations)
> for that name shall be in scope at the point where the name appears in the template definition; the
> name is bound to the declaration (or declarations) found at that point and this binding is not affected by
> declarations that are visible at the point of instantiation.
>
> 14.6.3 Non-dependent names/1
> Non-dependent names used in a template definition are
> found using the usual name lookup and bound at the
> point they are used.



147 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 01:07:07 ]
補足。
>っていうか、SFINAE を使う場合に用いられる場合がある。
Modern C++ Design に優先順位が最低であることがポイントであるとした上で載ってるので
変態 templater にはそれなりに知られたテクニックだと思われ。

148 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 01:13:14 ]
む・・・むずいw

149 名前:135 mailto:sage [2009/03/21(土) 01:20:21 ]
>146
調べきれてないけど4.2.4の方が(規格的には)正しいような
気がしてきました。

NS2->NS1の書き換えはADLの関係でget(HUGA*)がヒット(2がかえる)。
だからget(HUGA*)を位置を変えずにNS1に持っていっても同様に
2がかえるのを確認しました。
get(void*)とget(HUGA*)をtemplate関数の特殊化とした場合
同様に2がかえる。
=> depend name?

それ以外の場合(オーバーロードの解決)は純粋に出現
順序で決定されると。
=> nondependent name?

もうちょっと調べてみます。ありがとうございます。

150 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 01:20:51 ]
解決されるときに(...)の優先度が最低になるのが見付からないなぁ
ま事実だけ覚えときゃ十分か

151 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 01:48:31 ]
>149
「NS2->NS1の書き換え」ってどこ書き換えたの?
テンプレート引数 T に依存するかどうかが dependent name かどうかの判断なので、
4.2.4 の挙動もおかしい気はする。
>それ以外の場合(オーバーロードの解決)は純粋に出現
>順序で決定されると。
先に宣言されたものが常に選ばれるみたいに読めて微妙。

>150
13.3.3.2/2

152 名前:135 mailto:sage [2009/03/21(土) 02:32:23 ]
>151
> 「NS2->NS1の書き換え」ってどこ書き換えたの?
135のサンプルを「NS1->NS2の書き換え」の間違えです。

まとめると
//1を有効 & 他無効 => 2
//2を有効 & 他無効 => 1
//3を有効 & 他無効 => 2

#include <stdio.h>
namespace NS1 { struct HUGA {}; }
namespace NS2 {
 int get(void*) { return 1; }
// int get(NS1::HUGA * ) { return 2; } //1
 template <typename T>
 int f() {
  NS1::HUGA huga;
  return get(&huga);
 }
 int get(NS1::HUGA * ) { return 2; } //2
}
namespace NS1 {
// int get(NS1::HUGA * ) { return 2; } //3
}
int main() { return NS2::f<int>(); }


153 名前:135 mailto:sage [2009/03/21(土) 02:42:13 ]
補足
152のサンプルは3.3.6では全部2になります。
4.2.4みたいにADLの対象か否かで解決遅延対処になるか
否かってのはなんかしっくりこない・・・。


154 名前:127 mailto:sage [2009/03/21(土) 05:46:58 ]
>>128
でたらめな比較結果を返す関数を与えた場合の動作は未定義なんですね。
致し方ないので既知の問題としてドキュメントに記載してユーザに注意
してもらうことにします。ありがとうございました。


155 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 08:00:42 ]
比較関数全体をユーザ定義にするんじゃなくて、比較処理はC++で書いて、
条件を(比較結果がデタラメにならない程度に)カスタマイズできるように
すればいい気がするなぁ。

156 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:19:32 ]
for_eachについて教えてほしいのですが、下記のコードでfor_eachの三番目の引数である
CPrint()に引数を設定ていないのにveciTableの要素が、void operator()(int iValue) 〜へ渡されているのはどうしてですか?
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;

struct CPrint {
  void operator()(int iValue) { printf("%d\n", iValue); }
};

int main() {
  vector<int> veciTable(3);
  veciTable[0] = 111;
  veciTable[1] = 222;
  veciTable[2] = 333;
  for_each(veciTable.begin(), veciTable.end(), CPrint());
  return 0;
}




157 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:22:22 ]
>>156
CPrint()(veciTable[0]) などのように operator () が呼び出されるから。

158 名前:デフォルトの名無しさん [2009/03/21(土) 13:22:33 ]
std::tr1::bindですが、↓がコンパイルできません。
Aのメンバ関数に引数を渡したいのではなくて、X::funcBにAを渡したいのです。
どうすればいいでしょうか。

class X {
 class A { ... };
 void funcA(void) { for_each(container.begin(), container.end(), std::tr1::bind(&X::funcB, _1)); }
 void funcB(const A& a) { ... }
 std::vector<A> container;
};

159 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:24:23 ]
>>158
エラーメッセージは?

160 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:26:23 ]
>>158
X のインスタンス指定が抜けてるよ。
std::tr1::bind(&X::funcB, this, _1) でいけるんじゃない?

161 名前:158 mailto:sage [2009/03/21(土) 13:46:42 ]
>>160 であっさりうまくいきました!
昨日一晩の苦労が…。感激です。

>>159
thisがないときのエラーメッセージは(VC9ですが)
「error C2825: '_Fty': '::' が後に続くときは、クラスまたは名前空間でなければなりません」の後
「テンプレートのインスタンス化 'std::tr1::_Result_type1...' の参照を確認してください」という
bind特有の長いメッセージが続きます。



162 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:21:43 ]
長文で申し訳ない。

>153
やっぱり 4.2.4 の挙動もおかしいと思う。
インスタンス化時点での名前解決の対象になるのは ADL のみみたいだけど、
そもそも、テンプレートパラメータに依存する dependent name に対するものだけなので。
ぴったりしたケースじゃないけど 4.3.1 に対してこんなバグレポもあがってるので、
gcc の挙動をそんなに信用できないと思う。
ttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=36883

テンプレートパラメータに依存しないものならインスタンス化を待たなくとも結果は変わらない
はずだし、遅延すると通常の名前に対するものと異なる直感に反する結果を与えかねないので、
定義時点で名前解決を行えばいい。
一方、テンプレートパラメータに依存する名前について定義時点のみで名前解決を行うとすると、
制約が強すぎる。例えば STL を使う場合、コンテナのヘッダをインクルードする前にコンテナの要素型と
必要な操作が宣言されていなければならない。
従って、インスタンス化まで名前の解決を遅延したいが何でもかんでも名前解決の対象にすると、
これまた直感に反する結果を与えかねない。
ということで、ADL のみに制限しているという理解。

……なんだが、14.6.4 の規定自体に問題がある気がしてきた。
ADL じゃない lookup はインスタンス化時点では行わないようにも読めるんだが、qualified name lookup も
インスタンス化時点で行われないと、dependent name な基本クラスのメンバにアクセスできなくなるので
そんなわけないと思うのだが。
C++ Templates The Complete Guide では dependent qualified name もインスタンス化時点で名前解決されるって
書いてあるんだが、一方、インスタンス化時点で名前解決されるのは ADL のみという記述も結構見かける。

163 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:27:34 ]
g++の挙動はおかしいから
有名なソフトじゃ禁止コーディング規約いっぱいあるよ

C++のインプリで世界最悪なのがg++だし

164 名前:デフォルトの名無しさん [2009/03/21(土) 20:10:57 ]
アンチg++必死だなw

165 名前:135 mailto:sage [2009/03/21(土) 20:28:38 ]
>162
つまみ食いみたいなレスになりますが・・・

>gcc の挙動をそんなに信用できないと思う。
私もgccのbugzilla幾つか確認したけどアサインされてないバグって
結構いっぱいありますな。外野があれこれいうのもなんだけどあれで
C++0x対応が収束するのやら。

> ということで、ADL のみに制限しているという理解。
そもそもオーバーロードは遅延名前解決の対象になるのか?
152の//3はnamespaceが違うのでget(void*)とはオーバーロードの
関係ではないわけで、そういう風に考えると、名前解決が遅延するのも
自然な気がしてきました(w

f()内でget呼び出しがTに依存していないのにも関わらず
名前解決が遅延するのがバグであったとしても、
本来はTに依存させて使用するのが普通で、そのバグを
前提にしたロジックを組まなければ何とかなるかと。


166 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:19:05 ]
>165
> そもそもオーバーロードは遅延名前解決の対象になるのか?
> 152の//3はnamespaceが違うのでget(void*)とはオーバーロードの
> 関係ではないわけで、そういう風に考えると、名前解決が遅延するのも
> 自然な気がしてきました(w

名前解決(というより照合と呼ぶべきかもしれないが)とオーバーロードの解決は別のステップで、
まず名前の解決を行い、その後、名前解決によって発見された候補関数群から、呼び出すべき関数が
選び出される(これがオーバーロードの解決)。
なので、名前の解決が遅延された時点でオーバーロードの解決も遅延される。
ちなみに、private とかのアクセス制限が確認されるのはこの後。



167 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 01:01:10 ]
>>163
>C++のインプリで世界最悪なのがg++だし
いるいる、「絶対○○」とか「世界一○○」とか何の根拠もなしに比較したかのように語る人w

168 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 01:28:11 ]
ここの住人は頭がみんな良さそう
名前空間なんて、
松坂大輔
宮川大輔
のようなものとしか理解してないんだがな、俺的には。

169 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:52:53 ]
よくわからんけど、gccは新しいのでやってくれ。windowsもlinuxも4.3.3以前のは入れてない。

170 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:12:11 ]
gccについて疑問に感じたのなら、本家のforumが待ってるよ。

171 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 16:44:02 ]
>>169
gccの4.x系は、Linux上での動作はいいが、Windows上での動作は問題があるって聞いてるんだが。
だからMinGWも最新安定版はg++は3.4.5なんだと。
(アルファ版なら4.x系もあるだろうが。)

172 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 16:46:44 ]
gcc の話は↓こちらでどうぞ。

GCCについて part8
pc11.2ch.net/test/read.cgi/tech/1192201659/

173 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 12:22:42 ]
聞いた話じゃなぁ

174 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:18:14 ]
心を振るわせる話なら信用するのに
どうして鼓膜を振るわせる話は信用しようとしないのだ。

175 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:30:19 ]
質問です
ソースファイルAでnewしたインスタンスを
別のソースファイルBでdeleteしたりしても大丈夫なんですか?

176 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:39:08 ]
インスタンスの実体が対応してれば大丈夫だろ



177 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 01:03:40 ]
変な設計だとは思うけどな

178 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 02:43:52 ]
コンストラクタをcppに書いて、デストラクタをインラインでヘッダに書けば普通に起こる状況だな

179 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 08:21:36 ]
クロスDLL問題ってのとは全くの別物だよね?
そもそもどうしてあれはダメなんだろ?

180 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:21:41 ]
それは、それぞれでnewとdeleteの実装が別物だとうまくいかないという話。
msvcr90.dllですべて統一するとか、shared_ptrのようにdeleteごと渡すとかすればいい。
そして、コンパイラが違うとvtblやRTTIの形式が違うという話へ続く……。

181 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:28:56 ]
そんな面倒事に悩まされる前に一つのモジュールに閉じ込める工夫に労力注げ…と

182 名前:179 mailto:sage [2009/03/24(火) 09:35:57 ]
>>180-181
へーそういうことか。
ありがとう!

183 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:12:11 ]
テンプレートの規則や仕様に
詳しくなれる本ってありますかね?



184 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:25:18 ]
>>183
ない

185 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:26:32 ]
>>184
嘘つくな洋書で一冊出てるだろ
教えろよ

186 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:27:32 ]
>>185
詳しくなれるかどうかは別。
詳しく書いてるかもしれないけど。



187 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:29:14 ]
c++ templatesとか
c++ template metaprogramming とか

188 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:30:10 ]
books.google.com/books?id=EotSAwuBkJoC&pg=PP1&dq=c%2B%2B+templates

189 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 01:24:12 ]
C++編(標準ライブラリ) 第27章 例外クラス
www.geocities.jp/ky_webid/cpp/library/027.html
ここで紹介されている
std::overflow_error
std::underflow_error
が起こる例は、例えばどんなのがあるの?
前者はともかく後者がわからん。。。

190 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 03:14:14 ]
標準じゃunderflow_error投げる規定は無さそうだな。 >189

191 名前:189 mailto:sage [2009/03/25(水) 09:38:25 ]
>>190
そうなのか。
とりあえず作っちゃった謎の例外か?
どうも。

192 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 11:17:10 ]
std::underflow_error - Google Code Search
www.google.com/codesearch?hl=en&lr=&q=std%3A%3Aunderflow_error&sbtn=Search

193 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 22:41:38 ]
0をboolに変換するとfalse, 0でない数をboolに変換するとtrueになるんだよね?
これは分かる。

では
falseをintに変換すると0, trueをintに変換すると1
ってのは仕様上正しい?
特に後者が心配でならないんだが、標準で1になることが保証されている?

194 名前:デフォルトの名無しさん [2009/03/25(水) 22:47:03 ]
>>193
> 4.5 汎整数昇格
> 4 bool 型の右辺値は,int型の右辺値に変換することができる。falseは,0になり,trueは,1になる。

195 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:15:06 ]
でも、int値をtrueと比較するのは危険なんだよね。

196 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:18:49 ]
別に気にするな
引き継いで逃げ切ればOK



197 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:30:32 ]
if ( int値を返す式 ) { }
は正常に動作するけど

if ( int値を返す式 == true ) {}
とやると意図したとおりに動かない可能性がでてくる

妙なルール。

198 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 17:19:01 ]
>if ( int値を返す式 == true ) {}
は if ( int値を返す式 == 1 ) {} と同じ動作?

199 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:56:19 ]
うん。

200 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 21:25:19 ]
左辺をboolに変換して比較すれば問題ないのにな
変なルールだよな仕方ないけど

201 名前:デフォルトの名無しさん [2009/03/26(木) 21:26:34 ]
201

202 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 01:14:18 ]
>>197
C が 0 以外は true と決めてたわけで better C としての
C++ は、従うしかなかったんちゃう?

まぁ、そんな言語は山ほどあるわけだが………


203 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 10:41:29 ]
比較とか論理演算とかが結果を0と1で返すから
trueをそっちに合わせたんじゃね?

204 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:23:37 ]
#define true 1
#define false 0
typedef char bool;
昔ありそうな超手抜き実装

205 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:24:25 ]
手抜き?

206 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:30:14 ]
Exceptional C++を読むとboolの必要性が説かれている



207 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:44:47 ]
int値をbool値に変換するのは情報の欠落が生じるけど、その逆は生じない。
だからint型とbool型を比較すると、暗黙の型変換のルールに従って、bool型の方がint型に昇格する。
結果、>>198のようになって、意図したとおりに動かなくなる。仕様どおり!・3・

208 名前:デフォルトの名無しさん [2009/03/27(金) 21:09:51 ]
C++の副作用に関して良く解らないので教えてください。

int a=0;
int b=0;
int func(int c){ b=a; return c; }

このとき、
func(++a);

を通ると、bに1が入ることは保障されますよね?

func(a++);

この場合はどうでしょうか?
bに0が入る?
bに1が入る?
鼻から悪魔?


209 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:16:01 ]
>>208
関数を呼ぶ直前と、関数から戻った直後に副作用完了点がある。
だから、どちらもbは1になる。

210 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:22:54 ]
>>209
有難うございます。


211 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:28:25 ]
>209
すいません。もうひとつ教えてください。

&& || ?: , 以外の演算子は副作用完了点ではないんですよね?
自分でオーバーロードした演算子の場合は
通常の関数と同じように関数に入る直前と戻った直後に副作用完了点はありますか?


212 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:32:31 ]
>>211
ある。

ただし、最初にあげてる演算子をオーバーロードした場合、
組み込み演算子と違って、オペランドの評価順序が不定になったり、
ショートサーキットでなくなったりするのには注意。

213 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:42:28 ]
有難うございます。

たびたびすみません。
「オペランドの評価順序が不定になる」とは何ですか?
組み込み演算子でも一般的に不定だと思うのですが、
オーバーロードによって不定でなかったものが不定になる場合があるのですか?


214 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:53:18 ]
あ、
組み込みの && || ?: , 演算子の評価順序のことですね?
自己解決しました。


215 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:22:27 ]
printfで64bit値(u_int64_t)を表示したい。
32bit環境では %llu
64bit環境では %lu
両対応でスマートな解決法ってないものだろうか?

define拾ってきて切り替えるくらいしか思いつかない


216 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:32:40 ]
unsigned long long にキャストしていつでも %llu で表示する




217 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:35:15 ]
VCとかは%I64uだったような
defineで切り替えるしかないんじゃね?

218 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:21:24 ]
末尾にLがついてるのってlong int だよな?

219 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:25:57 ]
>>216
その手があったか!
思考がループしてそこまで考え付かなかった。 thx


220 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 01:23:02 ]
C99かC++0xでは<inttypes.h>のPRIu64を使う

221 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:28:24 ]
>>220
それだと、uint64_t使えというところから始めないと。

222 名前:193 mailto:sage [2009/03/28(土) 19:54:02 ]
>>194
あまりにもな遅レスすまんかった!!
ちょっと私用が。。。

汎整数昇格 了解しました。
ありがとう。

223 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:31:56 ]
最近C++の勉強をはじめた者なんですが、n個のデータを打ち込んで
それらの平均値や標準偏差を求めるプログラムを打ち込んだところ、

.\例題2.1.cpp(10) : error C2679: 二項演算子 '>>' : 型 'const char [2]' の
右オペランドを扱う演算子が見つかりません (または変換できません)。

というエラーが出てしまったんですが、なにが原因かさっぱりわかりません。
いつもと同じように打ち込んだつもりなのですが、原因分かる方いませんか?

224 名前:デフォルトの名無しさん [2009/03/28(土) 23:33:21 ]
せめて例題2.1.cppの10行目くらい見せろよ

225 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:43:10 ]
cout<<"nの値は?"; cin>>n>>"\n";

こうなっています。見たところどこにもミスはないと思うのですが・・・

226 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:45:32 ]
>>225 cout<<"nの値は?"; cin>>n;




227 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:47:54 ]
>>225
場合によって意味が変わるけど<<は出力、>>は入力
cin >>n
nに入力された値を入力
n>>"\n";
次に入力された値を"\n"に入力
だぞ?

おかしいだろ

228 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:50:52 ]
>>226
ああ、なるほど!入力と出力の指令が混同してましたね(汗)
こりゃ動かんわ・・・どうもありがとうございました!!






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<185KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef