&と&&の違いは何でしょうか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NightShift
記事: 10
登録日時: 1年前

&と&&の違いは何でしょうか?

#1

投稿記事 by NightShift » 1年前

下記のソースコードの&と&&の違いを教えてください。
参考書を見ながらノベルゲームを作っていますが、
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
に&と書いてありまして、そのまま書いたらクリックしている間は
文字が表示できるように実装できましたが、
&となっているところを&&と書いても同じように動作します。

お手数をおかけしますが、ご確認をよろしくお願いします。

コード:

#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	char message[] = "Hello world";
	int hoge = 35;

	int background;

	int main_character;
	int white = GetColor(255, 255, 255);
	//キー状態
	char keyStatus[256];

	int posX, posY;

	//ウィンドウモードで起動
	ChangeWindowMode(TRUE);

	if (DxLib_Init() == -1)		// DXライブラリ初期化処理
	{
		return -1;			// エラーが起きたら直ちに終了
	}

	//フォントサイズを変更
	SetFontSize(25);

	//フォント変更
	ChangeFont("MS 明 朝");

	//文字列表示
	DrawFormatString(60, 60, white,
	"message : %s -- value : %d", message, hoge);

	//デバッグ用にコンソールを呼び出す
	/*AllocConsole();
	freopen("CONOUT$", "w", stdout);
	freopen("CONIN$", "r", stdin);
	printf("Hello world!");*/
	//コンソール解放
	//FreeConsole();

	SetDrawScreen(DX_SCREEN_BACK);

	//マウスを表示状態にする
	SetMouseDispFlag(TRUE);

	background = LoadGraph("背景_ぬるもや.png");
	main_character = LoadGraph("KoichiKimura_Sad.png");
	//画像描画
	for (int i = 0; i < 500; i += 5)
	{
		DrawGraph(0, 0, background, FALSE);
		DrawGraph(i, 150, main_character, TRUE);
		ScreenFlip();
		ClearDrawScreen();
		if (ProcessMessage() == -1) break;
	}

	while (CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		if (ProcessMessage() == -1) break;
		
		ClearDrawScreen();
		DrawString(20, 20, "Escキーでプログラム終了", white);

		//マウスポインタの座標を取得
		GetMousePoint(&posX, &posY);
		if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
			{
				DrawFormatString(40, 40, white, "マウスの座標( %d, %d )", posX, posY);
			}
		ScreenFlip();
	}
	
	//WaitKey();				// キー入力待ち

	DxLib_End();				// DXライブラリ使用の終了処理

	return 0;				// ソフトの終了 
}

ゆきかぜ

Re: &と&&の違いは何でしょうか?

#2

投稿記事 by ゆきかぜ » 1年前

http://www.c-lang.org/operator.html
ここにわかりやすくまとめられています。

かずま

Re: &と&&の違いは何でしょうか?

#3

投稿記事 by かずま » 1年前

では、MOUSE_INPUT_LEFT を MOUSE_INPUT_RIGHT に変えてみてください。

if ((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0) の場合、
マウスの右ボタンを押している間、座標が表示されます。
マウスの左ボタンを押しても座標は表示されません。

if ((GetMouseInput() && MOUSE_INPUT_RIGHT) != 0) の場合、
マウスの右ボタンを押しても左ボタンを押しても座標が表示されます。

&演算子と &&演算子の違いが分かったのなら、上記のようになることが
説明できますね。よろしくお願いします。

分からない場合は、もう一度質問していただければ、説明します。

NightShift
記事: 10
登録日時: 1年前

Re: &と&&の違いは何でしょうか?

#4

投稿記事 by NightShift » 1年前

ゆきかぜさん、かずまさん

アドバイスを頂きありがとうございます。

僕の推測があっているか確認していただきたいです。
どうかよろしくお願いします。

&はビット演算子で僕が書いたソースコードの場合、
GetMouseInput()とMOUSE_INPUT_RIGHT
のビットを比較して、両方のビットが共に「1」の場合だけ「1」にするので、
GetMouseInput()がMOUSE_INPUT_RIGHTと全く同じビットを返したときに
このif文を通る。

&&は論理演算子で僕が書いたソースコードの場合、
GetMouseInput()とMOUSE_INPUT_RIGHTを比較して、
GetMouseInput()がMOUSE_INPUT_RIGHTや
MOUSE_INPUT_LEFTと同じ値を返すため、
マウスの右ボタンを押しても左ボタンを押しても座標が表示される。

上記であっておりますでしょうか。
正直なところ、GetMouseInput()とMOUSE_INPUT_RIGHTのビット
と返り値をどうやって確認すればよいかわからず、
推測でしか答えられませんでした。

また、アドバイスをして頂けるとありがたいです。
どうかよろしくお願いします。

かずま

Re: &と&&の違いは何でしょうか?

#5

投稿記事 by かずま » 1年前

NightShift さんが書きました:
1年前
正直なところ、GetMouseInput()とMOUSE_INPUT_RIGHTのビット
と返り値をどうやって確認すればよいかわからず、
推測でしか答えられませんでした。
DxLib をインストールしたフォルダにある DxLib.h を見てください。

コード:

// マウス入力定義
#define MOUSE_INPUT_LEFT   (0x0001)  // マウス左ボタン
#define MOUSE_INPUT_RIGHT  (0x0002)  // マウス右ボタン
NightShift さんが書きました:
1年前
&はビット演算子で僕が書いたソースコードの場合、
GetMouseInput()とMOUSE_INPUT_RIGHT
のビットを比較して、両方のビットが共に「1」の場合だけ「1」にするので、
GetMouseInput()がMOUSE_INPUT_RIGHTと全く同じビットを返したときに
このif文を通る。
左右のボタンを同時に押した場合、GetMouseInput() は 3 を返します。
MOUSE_INPUT_RIGHT の 2 と全く同じビットではありませんが、
3 & 2 は 2 なので、if文を通ります。
NightShift さんが書きました:
1年前
&&は論理演算子で僕が書いたソースコードの場合、
GetMouseInput()とMOUSE_INPUT_RIGHTを比較して、
GetMouseInput()がMOUSE_INPUT_RIGHTや
MOUSE_INPUT_LEFTと同じ値を返すため、
マウスの右ボタンを押しても左ボタンを押しても座標が表示される。
何もボタンを押していない場合、GetMouseInput() は 0 を返すので
GetMouseInput() && MOUSE_INPUT_RIGHT は 0 && 2 で 0 になります。

左ボタンを押すと、GetMouseInput() は 1 を返し、
1 && 2 は、左右のオペランドがともに 0 ではないので 1 になります。

右ボタンを押すと、GetMouseInput() は 2 を返し、
2 && 2 は、左右のオペランドがともに 0 ではないので 1 になります。

左右両方のボタンを押すと、GetMouseInput() は 3 を返し、
3 && 2 は、左右のオペランドがともに 0 ではないので 1 になります。

「if (式) 文」の「式」の値が 0 でない場合に「文を実行するので、
if (GetMouseInput() & MOUSE_INPUT_RIGHT) と書けます。
!= 0 は不要です。

NightShift
記事: 10
登録日時: 1年前

Re: &と&&の違いは何でしょうか?

#6

投稿記事 by NightShift » 1年前

かずまさん

ご回答をありがとうございます。

&の方は理解しました。

&&の方は、
&&の左右の値が0でないときは1を返すので、
!= 0の条件に当てはまり、
if文を通ると理解しました。

返信

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