条件式に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ibis

条件式に関して

#1

投稿記事 by ibis » 18年前

以下のソースで例外が投入されるのですが。


//初期化
string str = static_cast<char>(0);

...

//問題箇所
if(*(str.c_str())){
...
//ここで例外投入
}


これを以下のようにして試しましたが、結果は同じ。


//問題箇所
if(!(*(str.c_str()))){
...
//ここで例外投入
}


ちなみに以下のソースでは例外は発生しない。


//問題箇所
if(*(str.c_str())){
/* ... */
//ここで例外投入
}


!演算子に関わらずif文が実行されているようですが、どういうことでしょう?
ポインタの用法が間違ってますか?
或いはstringの用法が間違ってるのでしょうか?
それから、0をchar型にキャストしたものは偽になると思ってますが、これは合ってますか?

ibis

Re:条件式に関して

#2

投稿記事 by ibis » 18年前

説明不足でしたが、if文の中の処理は、strの値が偽なら例外が投入されます。


以下のソースコードでは普通に動作しました。

//問題箇所
//if(*str.c_str){
無関係な処理
//...
//ここで例外投入
//}


このコードでは例外が発生しました。

//問題箇所
if(*str.c_str){
無関係な処理
//...
//ここで例外投入
}


条件式を戻り値が偽の別の関数に置き換えてみても例外が投入されます。
条件を定数(false)にしたら例外は投入されません。

例外が投入されるのは以下の条件だと推察します。
・条件が定数でなくて、条件と処理が共にコメントアウトされていない場合
・if文の中の処理が例外を投入(これは意図された処理ですが)
どういうことですかねぇ?
ここまで考えたところで意味不明なんですが。

Justy

Re:条件式に関して

#3

投稿記事 by Justy » 18年前

 環境がわからないですし、string型が std::stringのことなのか
それとも何か自作・多作の型なのかわかりませんが、
とりあえず std::stringだと仮定します。

 その謎の 0による stringクラスの初期化を止めて下さい。
 それでどうなりますか?

たかぎ

Re:条件式に関して

#4

投稿記事 by たかぎ » 18年前

string が std:string の意味であるなら...

> string str = static_cast<char>(0);

は、

string str(string(NULL));

の意味です。
結果的に未定義の動作を引き起こしています。

ibis

Re:条件式に関して

#5

投稿記事 by ibis » 18年前

std::stringです。

そうですね。
0での初期化はミステイクでした。
等式や不等式演算子に慣れないのでそうしましたが、
よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。

ちょっと試してみます。

ibis

Re:条件式に関して

#6

投稿記事 by ibis » 18年前

残念ながら解決できず。

条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても
何故か異常終了するのですが。

環境はBCCで、WIN32APIを使用しています。

たかぎ

Re:条件式に関して

#7

投稿記事 by たかぎ » 18年前

> よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。

empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?

> 条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても

変えたプログラムを補足していただかなければ、何ともいえません。

ibis

Re:条件式に関して

#8

投稿記事 by ibis » 18年前

>> よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。

>empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?

言葉足らず。
空で初期化しておいて、ということです。


いろいろとやってたら解決しました。
Justyさん、たかぎさん、ありがとうございました。

ibis

Re:条件式に関して

#9

投稿記事 by ibis » 18年前

すみません、「解決!」マーク付け忘れました。
アイコンも「質問」になってますし。

閉鎖

“C言語何でも質問掲示板” へ戻る