$aと$bと$cが同じ時に真にするには?

[上に] [前に] [次に]
匿名 1999/06/08(火) 02:21:24
$aと$bと$cが3つとも3であるとき真になるようなif文にしたいのですが、
やはりifを何度も重ねあわせるしかないのでしょうか・・・?
if文だらけでごちゃごちゃしちゃってるので
なるべくスマートにしたいです。

匿名 1999/06/08(火) 02:24:59
3のときだけじゃなくて、
3つとも同じ数値のときでも真になるようにしたいです。
お願いします。

きゅんべる 1999/06/08(火) 02:31:31
if (($a == $b) && ($b == $c)) {ほにゃらら}

でいいんじゃないですか?

じぇい 1999/06/08(火) 02:34:05
if(($a & $b) == $c){ほにゃらら}

でもいいですよね?

B-Cus 1999/06/08(火) 02:41:38
> if(($a & $b) == $c){ほにゃらら}
> でもいいですよね?
のんのん。$a=3; $b=7; $c=3; のときがダメです。

じぇい 1999/06/08(火) 02:52:27
>のんのん。$a=3; $b=7; $c=3; のときがダメです。

はりり、、??

きゅんべる 1999/06/08(火) 04:19:03
>>のんのん。$a=3; $b=7; $c=3; のときがダメです。
>
>はりり、、??

 だって、(3 & 7) は 3 ですもんね。

> if(($a & $b) == $c){ほにゃらら}
 でも、「$a か $b の少なくとも一方が $c と同じときは」
という条件には使えますね。

じぇい 1999/06/08(火) 05:09:45
なにやらとんでもない勘違いをしていたみたいです。お恥ずかしい。^^;
($a & $b) はその通り $a と $b 二つを抱えてるってことだったんですね、、。
なんかでしゃばってすいません。m(_ _)m

B-Cus 1999/06/08(火) 07:17:11
> でも、「$a か $b の少なくとも一方が $c と同じときは」
> という条件には使えますね。
のんのん。$a=7; $b=11; $c=3; のときがダメです。

きゅんべる 1999/06/08(火) 07:42:06
>のんのん。$a=7; $b=11; $c=3; のときがダメです。
・・・・・ほんと、寝ぼけてたみたいです。

yasu [HomePage] 1999/06/08(火) 21:56:56
話しの結果がどうなっちゃったんだか・・・(@_@)
答えじゃなくて、質問かも。
確認していないから・・・(^^;)
if ($a eq $b eq $c) { exit; }
とか出来ないんですかね?
っていうか、みなさんif ($abc == $def)とC風になっていますが、
Perlってeqやneじゃないんですか?
とほほさんのカウンターも確か==使っていたような。
大丈夫なんですかね?

ふじ 1999/06/08(火) 22:31:38
>($a eq $b eq $c)
これは syntax error になります。

>Perlってeqやneじゃないんですか?
数値の比較はPerlでも == です。
真:3.0 == 3
真:'3.0' == '3'
偽:'3.0' eq '3'

>とほほさんのカウンターも確か==使っていたような。
数値を比較するところで使っているから、大丈夫だと思いますが。

で、結局、
(($a == $b) && ($b == $c))
しかないのかな・・・。3つぐらいなら特に複雑って訳でもないし。

じぇい 1999/06/08(火) 23:14:34
便乗してこの際超初心者丸出しの質問をさせていただきます。
らくださんを見たのですが、、、載っていませんでした。。(載ってないはずはないと思うのですが、、30分ほど探した結果見つかりませんでした。もしかしたら僕の所有しているらくださんは偽者かも。。こちら(とほほさんのページ)にもANDとORという説明しかありませんでした。)
今までずっと勘違いをしていたようなのですが、、B-Cusやきゅんべるさんなどの意見を聞いていて判断したのですが、

($a & $b) というのは、$a が真のときは $b、$a が偽のときは $bを表す、、、ということでしょうか?

じぇい 1999/06/08(火) 23:42:10
あっ、、失礼…。(この前B-Cusさんに怒られたばかりなのに、、。)
>($a & $b) というのは、$a が真のときは $b、$a が偽のときは $b
>を表す、、、ということでしょうか?
これではどっちもいっしょです、、。すいません。
結局 & とは、、?

Nobu3 1999/06/09(水) 00:00:41
ビット演算では?()内は10進数。
11(3)&111(7)=11(3)
111(7)&1011(11)=11(3)

ハズレかも・・・

Nobu3 1999/06/09(水) 00:05:35
仮の変数1コと配列を使えば
いくつでもできます。よね?
3つくらいだったら必要ないけど。

じぇい 1999/06/09(水) 00:15:36
あっ、、なるほど。。
ビット演算、、そういえば昔そんな感じのを習ったような、、(C言語入門書で)。
とてもわかりやすいご説明どうもありがとうございました、、。って僕が解決押すんじゃないんですね。(笑)
話題がそれてしまいました。m(_ _)m

ふじ 1999/06/09(水) 00:29:49
で、本題の(^^;
複数個の変数が一致したら真を返す関数の例。
#いろんな書き方があると思いますが。

sub all_eq
{
my(@a) = @_;
foreach (@a[1..$#a]){
return 0 if ($a[0] != $_);
}
1;
}

$a, $b , $c が全て3であるときに真、なら
&all_eq(3, $a, $b, $c);

$a, $b , $c が全て等しいときに真、なら
&all_eq($a, $b, $c);

mm 1999/06/09(水) 00:48:24
>>($a eq $b eq $c)
>これは syntax error になります。
ウッソー? …と思って試したら、ホントでした(^o^;ゞ
perlでは eq も == も結合則は「なし」なんですね。
勉強になりますm(_ _)m

ちなみに、Cでは、もちろん、
if ( a == b == c ) { exit(); }
は、OKです…意味があるとは思えないけど…

そうそう、ビット演算子は、perl5のらくだ本では、1.5 演算子にはなくて、
2.5 演算子の2.5.13 です。

B-Cus 1999/06/09(水) 00:58:09
> Cでは、もちろん、
> if ( a == b == c ) { exit(); }
ほう、ということはCでは if ( a < b < c ) もOKなんですね。
それは知らなかった。
## 注: if ( a==b==c ) は if ( a==b && b==c ) と等価ではないし、
##   if ( a<b<c ) は if ( a<b && b<c ) と等価ではない。

mm 1999/06/09(水) 01:50:56
>ほう、ということはCでは if ( a < b < c ) もOKなんですね。
そうですね。Cの場合は、< や == は左結合なので、
if ( (a < b) < c ) と解釈されて、cが1より大きければ、常に真です。

>## 注: if ( a==b==c ) は if ( a==b && b==c ) と等価ではないし、
あっ、フォローありがとうございますm(_ _)m
私の書き方では誤解を生むおそれがありますね。

if ( a==b==c )は、あくまでsyntax errorになるかどうかという話で、
今回のご質問とはなんの関係もないものです。

たこすけ 1999/06/10(木) 11:11:27
unless(($a|$b) != $c){ほにゃらら}
なんてのも駄目なんでしょうか?

# if文じゃないから駄目とかじゃなくて
# 条件式として駄目ですか?という便乗質問です。

Tmb 1999/06/10(木) 11:37:45
これも | がビット演算子のor(論理和)なら駄目なのでは?
#a=1, b=2, c=3のとき
#1 or 2 = 3 (2進数なら 01 or 10 =11)だから成り立つような。

たこすけ 1999/06/10(木) 12:39:46
> これも | がビット演算子のor(論理和)なら駄目なのでは?
> #a=1, b=2, c=3のとき成り立つような。
という事はa=1, b=6, c=7でも成り立っちゃう訳ですね。
なるほろ。Tmbさんありがとうございました。

mm 1999/06/10(木) 17:59:30
何がなんでも、ビット演算でやりたいというのであれば…
unless ( ($a ^ $b) | ($b ^ $c) ) { ... }
では?($b を2回使うのはルール違反かな?)

一般に & や | 演算は、情報が削られるので、
これらを使って*簡単に*判定することはムリだと思います。

で、質問者の方は、解決したのかな?

[上に] [前に] [次に]