1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「&&」と「and」はどっちを使えばいい?

Last updated at Posted at 2025-01-26

はじめに

プログラミング言語で論理演算を扱いたいとき,演算子としてよく,and (or, not) と && (||, !) が使われます.

例えば,Pythonでは,

(a == 1) and (b == 2)

と書くことができますし,Javaでは,

(a == 1) && (b == 2)

と書くことができます.

C++, PHP, Ruby などの一部言語では,and (or, not) と && (||, !),両方の演算子を採用しています.

それぞれの演算子にはどのような違いがあるのでしょうか?また,どちらの演算子を使えばよいのでしょうか?

気になったので調べてみました.

演算子の仕様

それぞれの言語で論理演算子がどのような仕様になっているのか調べてみました.

C++ の場合

C++ では,&& がデフォルトで使用できる演算子で,and はその 代替表現 として使用できます.[1]

代替表現の演算子には,以下のようなものがあります.

代替表現 本来の字句
and &&
and_eq &=
bitand &
bitor |
compl ~
not !
not_eq !=
or ||
or_eq |=
xor ^
xor_eq ^=

あくまで代替表現であるので,演算子の意味や優先順位に違いはありません.

PHP, Ruby の場合

PHP, Ruby では and, && の両方を使用することが可能です.

ただし,and&& より演算子が低く設定されています.[2] [3]

演算子の優先順位を整理すると以下の通りです.(優先順位の高い順)

  • !
  • &&
  • ||
  • not
  • and
  • or

(PHP には論理演算子 not はありません)

動作の違い

and&& について,C++では優先順位が同じ,PHP, Rubyでは && の方が優先順位が高いということがわかりました.

この仕様の影響で,and (or, not) と && (||, !) を混用すると,結果に違いが生じます.

本記事では,以下の2つの論理式を比較します.

true || false &&  false
true || false and false

C++, PHP, Ruby の各項目で2つの論理式を実行した結果は以下の通りです.

論理式 C++ PHP Ruby
true || false && false true true true
true || false and false true false false

言語ごとに違った結果が確認されました.

実験環境
  • C++
    • Ubuntu 22.04 (WSL2)
    • g++ 11.4.0
  • PHP
    • Docker (php:8.2-cli)
  • Ruby
    • Ubuntu 22.04 (WSL2)
    • ruby 3.0.2p107
実験時のソースコード
  • C++
#include <iostream>
using namespace std;

void printBool(bool b) {
    cout << (b ? "true" : "false") << endl;
}

int main() {
    printBool( true || false &&  false );
    printBool( true || false and false );
}
  • PHP
<?php
function printBool($bool) {
    echo ($bool ? 'true' : 'false') . "\n";
}
printBool(true || false && false);
printBool(true || false and false);
?>
  • Ruby
puts (true || false &&  false)
puts (true || false and false)

C++の場合,and&& の優先順位が同じ = || より and の優先度が高いため,

true || ( false and false ) # -> true || false -> true

といったように解釈されます.

PHP, Rubyの場合,and より || の方が優先度が高いため,

( true || false ) and false  # -> true and false -> false

といったように解釈されます.

このように,演算子の優先順位の違いが,式の評価の違いを生じさせています.

結局どちらを使うのがいいのか?

and (or, not) と && (||, !) は実行上はどちらを使っても問題ありませんが,どちらを使うのが望ましいのでしょうか?

C++ のコーディング規約 (Google C++ Style Guide) では以下のように記述されていました.

and ではなく,&& を使わなければならない [4]

他の言語のコーディング規約では確認できませんでしたが,一般論として,and ではなく && を使うのが望ましいようです.

まとめ

本記事では,and (or, not) と && (||, !) の違いについて調べてきました.

言語によって,and (or, not) の優先順位の扱いに違いがあり,and (or, not) と && (||, !) を混在させると出力結果に違いが出ることがわかりました.

コーディングする際には,少なくとも混在させることを避けてどちらかに統一し,わかりやすさや混乱防止のためにも,&& (||, !) を使うことが望ましいと考えられます.

参考文献

  1. 柴田望洋『新・明解C++入門』初版(第8刷), SBクリエイティブ株式会社, 初版:2017年(第8刷:2022年), 66ページ.

  2. PHP公式マニュアル『演算子の優先順位』The PHP Documentation Group,https://www.php.net/manual/ja/language.operators.precedence.php.(最終アクセス日: 2025年1月26日)

  3. Ruby公式ドキュメント『Ruby 演算子の仕様』,https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html.(最終アクセス日: 2025年1月26日)

  4. Google, "Google C++ Style Guide", https://google.github.io/styleguide/cppguide.html#Boolean_Expressions. (最終アクセス日: 2025年1月26日)

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?