これは、 CおよびC++プログラミング言語の演算子 の一覧です。
記載されている演算子はすべてC++のものであり、特に明記がない限りC言語でも使用できます。一部の表には、演算子がC言語でも使用できるかどうかを示す「C言語でも使用可能」列があります。なお、C言語は演算子オーバーロードをサポートしていません。
オーバーロードされていない場合、演算子&&、||、および,(コンマ演算子) については、最初のオペランドの評価後にシーケンスポイントがあります。
C言語とC++で使用できる演算子のほとんどは、 C#、D言語、Java、Perl、PHPなどの他のC系言語でも、同じ優先順位、結合規則、意味論で使用できます。
一連の記号で指定される多くの演算子は、それぞれの記号の名前を組み合わせた名前で呼ばれるのが一般的です。例えば、 `+` と `+`+=は-=、より冗長な「加算による代入」や「減算による代入」ではなく、「プラス等号」や「マイナス等号」と呼ばれることがよくあります。
以下の表では、小文字の や などは、aそれぞれbリテラル値、オブジェクト/変数名、または l 値を表します。R、Sおよび はTデータ型、 はKクラスまたは列挙型を表します。一部の演算子には、二文字記号や三文字記号を使用した別の綴り、または演算子の同義語があります。
C言語とC++は同じ算術演算子を持ち、C++ではすべてオーバーロードが可能です。
C++ では、すべての関係演算子 (比較演算子) をオーバーロードできます。C ++20以降、不等号演算子はoperator==が定義されている場合に自動的に生成され、4 つの関係演算子はすべて が定義されている場合に自動的に生成されますoperator<=>。[ 1 ]
C言語とC++は同じ論理演算子を持ち、C++ではすべてオーバーロードが可能です。
論理ANDとORのオーバーロードは推奨されません。オーバーロードされた演算子は、短絡評価の通常の意味を提供する代わりに、常に両方のオペランドを評価するためです。[ 2 ]
C言語とC++は同じビット演算子を持ち、C++ではすべてオーバーロードが可能です。
CとC++は同じ代入演算子を持ち、C++ではすべてオーバーロードが可能です。
組み合わせ演算子の場合、a ⊚= b(ここで は⊚演算を表す)は と同等ですa = a ⊚ bが、 はa一度だけ評価されます。
C++ では、多数の演算子のエイリアスとして機能するキーワードが定義されています。[ 7 ]
各キーワードは演算子を指定する異なる方法であり、対応する記号表現の代わりに使用できます。たとえば、(a > 0 and not flag)と は(a > 0 && !flag)同じ動作を指定します。別の例として、キーワード はビットごとの AND演算子bitandだけでなくアドレス演算子も置き換えるために使用でき、参照型 (例: ) を指定するためにも使用できます。int bitand ref = n
ISO C 仕様では、これらのキーワードをヘッダーファイル内のプリプロセッサ マクロとして使用できますiso646.h。C との互換性のために、C++ はヘッダーも提供していますがiso646.h、これをインクルードしても効果はありません。C++20 までは、対応するヘッダーも提供されていましたが、ciso646これも効果はありませんでした。
式の評価中、部分式の評価順序は、優先順位と結合規則によって決定されます。優先順位の高い演算子は、優先順位の低い演算子よりも先に評価され、演算子のオペランドは結合規則に基づいて評価されます。次の表は、C および C++ 演算子の優先順位と結合規則を示しています。演算子は、優先順位が同じグループに分けられ、グループは上から下へ優先順位の高い順に並べられています (順序が低いほど優先順位が高くなります)。[ 8 ] [ 9 ] [ 10 ]
オペレーターの優先順位は、過負荷の影響を受けません。
この表はほとんどの評価順序を説明するのに十分ですが、いくつかの詳細については説明していません。三項演算子は、代入演算子やカンマ演算子よりも優先順位が高いと記載されているにもかかわらず、任意の式を中間オペランドとして使用できます。したがって、は、意味のないではなく、として解釈されます。つまり、条件演算子の中間(と の間)の式は、括弧で囲まれているかのように解析されます。また、C キャスト式の括弧なしの直接の結果は、のオペランドにすることはできません。したがって、は、ではなくとして解釈されます。a ? b, c : da ? (b, c) : d(a ? b), (c : d)?:sizeofsizeof (int) * x(sizeof(int)) * xsizeof ((int) * x)
優先順位表は、括弧で明示的に指定されていない場合に、連鎖式における結合の順序を決定します。
++x*3何らかの優先順位ルールがないと、は曖昧です。優先順位表は、xが*よりも++に強く「束縛」されていることを示しています。したがって、++ が何をするにしても (今すぐでも後ででも—下記参照)、それはxに対してのみ行われ(には行われません)、( 、 )と同等です。x*3++xx*33*x++場合、後置++は式全体が評価された後に作用するように設計されていますが、優先順位表から、xのみがインクリメントされ(ではなく)、実際には、式(、 )はtmpを一時値として評価されます。これは、 ( 、、 )のような式と機能的に同等です。3*xtmp=x++3*tmptmp=3*x++xtmp
C言語とC++における演算子の束縛は、優先順位表ではなく、因子化された言語文法によって規定されます。これにより、微妙な矛盾が生じます。例えば、C言語における条件式の構文は次のようになります。
論理式- OR -式?式:条件式C++では次のようになります。
論理式- OR - ?式:代入式したがって、次の表現が成り立ちます。
e = a < d ? a++ : a = d 2つの言語では解析方法が異なります。C言語では、この式は構文エラーです。C言語における代入式の構文は次のとおりです。
単項式' = '代入式C++では、次のように解析されます。
e = ( a < d ? a ++ : ( a = d ))関数呼び出しの引数式、変数代入、またはカンマ区切りリストでカンマ演算子を使用するには、括弧の使用が必要です。[ 13 ] [ 14 ]例えば、
int a = 1 , b = 2 , weirdVariable = ( ++ a , b ), d = 4 ;ビットごとの論理演算子の優先順位は批判されてきた。[ 15 ]概念的には、& と | は * や + のような算術演算子である。
式は構文的に と解析されるのに対し、式は と解析されます。そのため、括弧を通常よりも頻繁に使用する必要があります。a&b==7a&(b==7)a+b==7(a+b)==7
歴史的に、ビット演算子と論理演算子の間に構文上の区別はありませんでした。BCPL 、B 、および初期のCでは、これらの演算子は存在しませんでした。代わりに、それらが「真偽値のコンテキスト」で使用されるかどうかに応じて異なる意味を持っていました(つまり、ブール値が期待される場合、たとえば、では論理演算子として動作しましたが、ではビット演算子として動作しました)。これは、既存のインストールとの後方互換性を維持するために保持されました。[ 16 ]&&||&|if(a==b&c){...}c=a&b
さらに、C++(およびそれ以降のバージョンのC)では、3方向比較演算子を除き、等価演算は概念的に1ビット(1または0)であるbool型の値を生成するため、「ビット単位」演算には適切ではありません。
fmod使用できます。intは、接頭辞と接尾辞を区別するためのダミーパラメータです。std::weak_ordering、std::strong_orderingおよび、std::partial_orderingこれらはすべて に変換可能です。<<>>operator &以下で取得できます。std::addressofoperator->()->xCCoperator->()x->yx.operator->()->y::C には句読点が存在するが、スコープ解決演算子としては使用されていない。alignof演算子が定義されていますが、C では定義されています_Alignof(C23 では両方とも定義されています)。どちらの演算子も同じ意味を持ちます。autoで宣言された発明変数 x の型に置き換えられます。auto x(a);auto x{a};operatorauto()operatordecltype(auto)()new auto