Re: 関数の戻り値の論理が逆になっている点
新城@筑波大学情報です。こんにちは。
In article <20040723001337.2222dcff.forest@ma.kcom.ne.jp>
"K.Moriyama" <forest@ma.kcom.ne.jp> writes:
> 森山と申します。
> C 言語の論理演算は通常通りで逆には成っていませんが、
> 予約関数の戻り値が逆になっています。
そうですか。けっこう成功した時に0以外、失敗した時に0のもの
が多いと思います。「予約関数」というと、具体的にどういうもの
でしょうか。
C言語では、ポインタが0になるということはあり得ないとしてプ
ログラムを作ることが多いです。ですから、ポインタを返すような
関数では、失敗した時に0を返します。
値がポインタではない時には、論理演算と同じで、正解が0以外、
失敗が0というのも、すぐ思いつきます。たとえば、こんな感じ。
if( isalpha(c) && islower(c) )
{
printf("アルファベットでかつ小文字です。");
}
少し紛らわしいのが、strcmp() かなあ。あれは、結果を == とか
< とか > で比較できるので、その部分を見るようにして、
if( strcmp(s,"ok") == 0 )
のように、== 0 を書きます。
あと、(Unixの) システムコール系は、失敗すると -1 で、成功す
ると正の数という風になっているのも多いです。
> bError = functionName ( ) ;
> if ( bError ) {
> エラー処理
> } else {
> 通常処理
> }
工夫するなら、マクロか何か書いて、こうする手もあります。
#define iserror(res) (res)
res = functionName ();
if ( iserror(res) ) {
エラー処理
} else {
通常処理
}
> 今のところは、以下のように論理値と適合する変数名で
> 一旦受けてから処理していますが...( 式の左右の名称が
> 逆になってしまうが、まだフローが追いやすい )
この辺りの「逆」という感覚は、最初に擦込まれたものに影響され
ることもけっこうあります。たとえば、スタックの延びる方法とか、
バイト順とか。
forward/backwardと前/後ろが、時間が絡んできたりすると日本語
と英語で逆なんですよね。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735