苦しんで覚えるC言語 7.1 比較を行う文 P134 – P143

比較を行う文

プログラム処理の中で必ず使用するものが比較処理です。
サンプリングしてきた値と、設計値として想定している値が一致しているかどうか?
どちらが大きい、小さいなど、比較処理は頻繁に活用します。

条件判断として比較する処理は以下の様に記載します。

 if (条件式) 文:

これでは何のことからわかりませんので、プログラム例を見ながら解説したいと思います。

int main(void)
{
   int value1 = 100;
   int value2 = 100;

   if(value1 == value2)
   {
      printf("value1とvalue2は一緒の値");
   }

   return 0;
}

if(value1 == value2)は、value1とvalue2がイコールかどうか?を比較しています。
条件式に該当する部分は、(value1 == value2)になります。

同じ値(=イコール)だった場合は、
printf(“value1とvalue2は一緒の値”);が処理されます。
これが、に該当する部分になります。

先に上記の書き方を例として解説した方が理解しやすいと思いましたが、参考書の記載例を見ていきたいと思います。

int main(void)
{
   int suuti = 10;

   if(suuti) printf("%d\n",suuti);

   return 0;
}

if(suuti) printf(“%d\n”,suuti); の書き方は通常はしません。
一般的に現場のプログラマは、上記の処理を以下の様に書くことが多いです。

if(suuti)
{
printf(“%d\n”,suuti);
}

文となる処理は、{ } で囲むのが慣習になります。
if(suuti)は、最初にご紹介した事例の様に == がありません。

これはC言語としてのルール上でOKな書き方になります。
参考書にも記載がありますが、suutiが0であれば偽、0以外は真として処理されます。
つまり、suutiの値が0以外であれば printf(“%d\n”,suuti); が処理されるわけです。

条件式として、 == を書いておく方が分かりやすいと思いますので、ご自身の思想に合う記載方法を見つけてください。

比較のための演算子

参考書に挙がっていますが、if文の条件式内で演算させることも可能です。
但し、私はこの様な記載を現場で見たことはありません。
その理由は、設計会社の設計規約として、複雑化して間違いが出ることを嫌がってNGとしているためです。

int main(void)
{
   int suuti;

   scanf("%d",&suuti);

   if(suuti - 10) printf("入力値は10ではありません。\n");

   return 0;
}

if(suuti – 10)この様な書き方はしない。です。
書くならば、以下の様にする方がわかりやすいです。

int main(void)
{
  int tmp;
  int suuti;

   scanf("%d",&suuti);

   tmp = suuti - 10;

   if(tmp == 10)
   if(tmp != 10)
   {
      printf("入力値は10ではありません。\n");
   }

   return 0;
}

該当部分が以下です。変数に演算結果を入れておいて、その変数を比較処理にかける方が良いです。

 tmp = suuti – 10;

if(tmp == 10)
{
printf(“入力値は10ではありません。\n”);
}

比較のための演算子

等値演算子としては2種類です。

記号真になる偽になる
==2つの値が等しい2つの値が等しくない
!=2つの値が等しくない2つの値が等しい

== は、左辺と右辺が同じかどうか。
!=は、左辺と右辺が違うかどうか。
同じ(=真)に重きがあるか、違う(=偽)に重きがあるかの差です。

int main(void)
{
   int value1 = 100;
   int value2 = 100;

  /* 同じことをチェックする */
   if(value1 == value2)
   {
      printf("value1とvalue2は一緒の値");
   }

  /* 違うことをチェックする */
   if(value1 != value2)
   {
      printf("value1とvalue2は違う値");
   }

   return 0;
}

関係演算子

同じ( == )、違う( != )だけが比較処理ではありません。
左辺と右辺のどちらが大きいか?小さいか?以上か?以下か?も比較処理ができます。

記号真になる偽になる
<左の値が右より小さい左の値が右より
大きい or 同じ値
>左の値が右より大きい左の値が右より
小さい or 同じ値
<=左の値が右以下である左の値が右以上
>=左の値が右以上である左の値が右以下

それぞれ例を記載してみましょう。

int main(void)
{
    int suuti = 10;

    /* 左が小さいか判定 */
    if(suuti < 20)
    {
        printf("左が小さいです");
    }

    /* 左が大きいか判定 */
    if(suuti > 1)
    {
        printf("左が大きいです");
    }

    /* 左が右以下 or 同じか判定 */
    if(suuti <= 10)
    {
        printf("左と右は同じです");
    }

    /* 左が右以上 or 同じか判定 */
    if(suuti >= 1)
    {
        printf("左が大きいです");
    }

  return 0;
}

論理演算子

比較処理に使う演算子として、少し特殊なものを解説します。
これも頻繁に使用しますので覚えておいてください。

記号意味真になる偽になる
&&AND右と左が両方真右と左のどちら偽
||OR右と左の片方が真右と左が両方偽
!NOT条件が偽条件が真

それぞれ例を記載してみましょう。

int main(void)
{
    int suuti = 10;

    /* 左が20よりも小さく且つ、1よりも大きい*/
    if(suuti < 20) && (suuti > 1)
    {
        printf("20より小さく1より大きい");
    }

    /* 左が20より大きいか、1より大きい */
    if(suuti > 20) || (suuti > 1)
    {
        printf("1より大きく、20より小さいです");
    }

    /* suutiが1ではないか判定 */
    if(! (suuti == 1)
    {
        printf("suutiは1ではありません");
    }

  return 0;
}

&&は、2つ以上ある条件式が全て合致している場合のみ{ }内の処理が実行されます。
||は、2つ以上ある条件式の一つでも合致している場合、{ }内の処理が実行されます。
!は、条件式ではない場合に{ }内の処理が実行されます。

if文の書き方

これまでif文の { } を以下の様に書いてきましたが、他の書き方でも構いません。

int suuti = 10;

if(suuti == 10)
{

}

{ を改行して記載しています。

int suuti = 10;

if(suuti == 10){

}

{ を改行せずに記載しています。

どちらも問題ありませんし、現場ではどちらも良く見ます。
比較的ですが、改行して記載する方が多い印象ではあります。

{から}が一括りなので、明示的にわかりやすいということが理由だと思われます。