Invalid operands to binary expression エラーの対処方法


演算子の不適切な利用によって、次のようなエラーが発生することがある。

f % f; // Invalid operands to binary expression ('float' and 'float')

a + b; // Invalid operands to binary expression ('Number' and 'Number')

if (a == b) {} // Invalid operands to binary expression ('Number' and 'Number')

これらのエラーは無効な演算が行われていることを表している。実数型と構造体型で異なる原因と対処が考えられる。

目次

スポンサーリンク

実数型の場合

原因

実数型(浮動小数点数型)に対応していない演算子が用いられていると、このようなエラーが発生する原因となる。とりわけfloat型やdouble型の余剰やビット演算の利用で本エラーが発生する。

double d = 9;
d << 1; // Invalid operands to binary expression ('double' and 'int')
d >> 1; // Invalid operands to binary expression ('double' and 'int')
d ^ d;  // Invalid operands to binary expression ('double' and 'double')
d & d;  // Invalid operands to binary expression ('double' and 'double')
~d; // Invalid argument type 'double' to unary expression
!d; // OK

対処方法

浮動小数点数型の余剰を行う場合には、fmod関数やfmodf関数を用いる必要がある。fmodはdouble型、fmodfはfloat型の計算に対応している。

// #include <math.h>
//   float fmodf(float x, float y);
//   double fmod(double x, double y);
double d = 9;

// Before
d % 6;

// After
fmod(d, 6);

構造体型の場合

原因

構造体同士の比較や演算についても、同様のエラーが発生する。C言語では構造体同士の比較は行えないため注意したい。

struct Number { int value; };
struct Number a = {9}, b = {9};
if (a == b) { puts("same"); } // Invalid operands to binary expression ('struct Number' and 'struct Number')
struct Number c = a + b;      // Invalid operands to binary expression ('struct Number' and 'struct Number')

対処方法(C言語/C++)

構造体同士の比較は行えないため、構造体のメンバ変数を個別に比較する必要がある。

struct Number { int value; };
struct Number a = {9}, b = {9};

// メンバ変数の値を比較する
if (a.value == b.value) { puts("same"); }

算術演算を行う場合も同様に、対象のメンバ同士の演算結果を新たな構造体のメンバとして生成する必要がある。

// 演算結果を保持する新たな構造体を宣言する
struct Number c = {a.value + b.value};
assert( c.value == 18 );

struct Number d;
d.value = a.value * b.value;
assert( d.value == 81 );

より詳しい説明は以下の記事が参考になる。

【C言語】構造体を比較する方法

対処方法(C++)

C++の場合は、演算子オーバーロード(演算子の多重定義)を行うことで、構造体同士の比較や演算を実現することができる。

struct Number {
  int value;
  bool operator==(const Number& x) { return x.value == value; }
  Number operator+(const Number& x) { return {x.value == value}; }
};
Number a{9}, b{9};
assert( a == b );        // OK

Number c = a + b;
assert( c.value == 18 ); // OK

より詳しい説明と非メンバ関数による多重定義の方法は以下の記事が参考になる。

【C++】比較演算子の定義

広告

関連するオススメの記事