[C 言語初級] すべての一般的な演算子を簡単に試してみよう (3) - 関係演算子、論理演算子、条件演算子、カンマ式

ここに画像の説明を挿入

Junxi_ の個人ホームページ

勤勉であり、誰も待たないように何年も費やすことを奨励してください

C/C++ ゲーム開発


こんにちは、Junxi_ です。最近忙しくて、更新する時間があります。今日は演算子に関する 3 番目のパートをお届けします。早速、直接始めましょう!

  • 正式な開始前に、オペレーターの基本的な内容を簡単に思い出すのに役立つマインド マップを今でも使用しています。

ここに画像の説明を挿入

  • 今日は単項演算子の後にそれについて話します

1. 関係演算子

>
>=
<
<=
!=  用于测试“不相等”
==    用于测试“相等”
  • これらの関係演算子は比較的単純であり、説明することはありませんが、一部の演算子を使用する場合は落とし穴に注意する必要があります。
  • たとえば、次のコード:
#include<stdio.h>
//判断并在屏幕上打印闰年
int main()
{
    
    
	int y = 0;
	scanf("%d", &y);
	//1. 能被4整除,并且不能被100整除
	//2. 能被400整除是闰年
	if (((y % 4 = 0) && (y % 100 != 0)) || (y % 400 == 0))
	{
    
    
		printf("闰年\n");
	}
	else
	{
    
    
		printf("不是闰年\n");
	}
	return 0;
}
  • コードでは、入力された年数が 4 で割り切れるかどうかを判断したいのですが、ここで注意してください。
if (((y % 4 = 0) && (y % 100 != 0)) || (y % 400 == 0))
  • ここで、y%4 に値 0 を代入する際に、誤って「y%4===0」と記述してしまいました。この時点では、プログラムはコンパイラを通過することさえできません。
    ここに画像の説明を挿入

警告します:

  • プログラミングの過程で == と = を誤って書き間違えてエラーが発生する

良いコーディングスタイル

  • 注意,在某些情况下,类似“==”和“=”用错时,编译器是不会报错的。
int main()
{
    
    
	int x = 0;
	if (x = 1)
	{
    
    
		printf("HEHE\n");
	}
	else
		printf("haha\n");
	return 0;
}

ここに画像の説明を挿入

  • ここでのxの初期値は0で、「はは」が出力されるはずですが、「==」を「=」と間違えて書いてしまったため、
  • つまり、間違った出力「HEHE」、コンパイラは現時点ではエラーを報告しませんでした。論理的に言えば、このコードは間違っていないからです。では、この時点でコードにエラーがあることをコンパイラに思い出させるには、この時点でコードをどのように変更すればよいでしょうか?
int main()
{
    
    
	int x = 0;
	if (1=x)
	{
    
    
		printf("HEHE\n");
	}
	else
		printf("haha\n");
	return 0;
}

ここに画像の説明を挿入

  • 左右の数字の位置を入れ替えることができますが、変数の値を定数に代入することはできないので、コードが間違っているかどうかを思い出させるためにこの方法を使用できます。
  • 正しいコード
int main()
{
    
    
	int x = 0;
	if (1==x)
	{
    
    
		printf("HEHE\n");
	}
	else
		printf("haha\n");
	return 0;
}

ここに画像の説明を挿入

  • これは間違いなく、上記のような簡単な変更を通じてコード内の潜在的なバグを見つけるのに役立つ優れたコード スタイルです。

2. 論理演算子

論理演算子とは次のとおりです。

&&   逻辑与
||   逻辑或
  • 論理 and とビット単位の and を区別する
  • 論理和とビット単位のORを区別する
1&2----->0//按位与作用与二进制补码,对应二进制位数都为1才为1,否则为0
1&&2---->1//一般作用于两边的条件,当两边的条件都i为真时才为真,否则为假
1|2----->3//按位或也是作用于二进制补码,对应二进制位数只要有一个为1就为1,只有两个同时为0才为0
1||2---->1//逻辑与两边条件只要有一个为真就为真,只有都为假才是假
  • ビットごとの and やビットごとの or などのビット演算子の知識については、演算子の詳しい解説の第 1 回でお話ししましたので、興味のある方はこちらをご覧ください: 【C言語初級】よく使う演算子をカンタンに遊んでみる(1) ~算術演算子、シフト演算子、ビット演算子

論理演算子の応用 面接の質問例

  • 論理演算子に対するみんなの印象を深めるために、大工場からの関連する面接の質問を取り上げてみましょう。
  • コードは以下のように表示されます。
#include <stdio.h>
int main()
{
    
    
  int i = 0,a=0,b=2,c =3,d=4;
  i = a++ && ++b && d++;
  printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
  return 0;
  }
  • 上記のプログラムの実行結果を判断してみてください。
    ここに画像の説明を挿入
  • なぜ?
  • 前述したように、論理 AND の条件のいずれかが条件を満たさない限り、偽になります。このとき、プログラムが a++ まで実行されると、後置 ++ であるため、この時点で a は 0 に等しいため、偽になります。このコード行は下方向に実行され続けず、直接停止します。このとき、後置に a が追加されるだけで、bcd の値は変更されないため、上記の出力結果が表示されます。
  • コードが次のような場合はどうなるでしょうか?
#include <stdio.h>
int main()
{
    
    
  int i = 0,a=0,b=2,c =3,d=4;
   i = a++||++b||d++;
  printf("a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
  return 0;
  }
  • このコードの結果はどうなるでしょうか?
    ここに画像の説明を挿入

  • なぜ?

  • || の両側の条件のいずれかが満たされている限り、論理和は true であることがわかっているので、この時点で a=0 を取り込みます。この時点では、++ の後、入力 0 はまだ false で、論理 or は下方向に実行され続けます。このとき、前方の ++b (この時点では b=3) は true で、論理和は下方向に実行されなくなります。このとき、a と b の値のみが 1 に加算され、残りは元の数値であるため、画面上の結果はと印刷されています。

  • 上記の 2 つの面接質問例を通じて、論理演算子について独自の洞察を得ることができると思いますので、引き続き学習していきましょう。


3. 条件演算子

exp1 ? exp2 : exp3//判断表达式1真假,条件如果为真,则执行表达式2,如果为假,则执行表达式3
  • したがって、上記のコードは if を使用して実装することもできます。
    if(exp1)
    exp2;
    else
    exp3;
  • 簡単なコード例を示します
int main()
{
    
    
	int a = 0;
	int b = 0;

	if (a > 5)
		b = 3;
	else
		b = -3;

	

	return 0;
}
  • 条件演算子を使用して実装されます。
int main()
{
    
    
   int a=0;
   int b=0;
//(a > 5) ? (b = 3) : (b = -3);
	b = ((a > 5) ? (3) : (-3));//与上一行代码两者等价
	return 0;
}

カンマ式

exp1, exp2, exp3, …expN
  • 逗号表达式,就是用逗号隔开的多个表达式。
  • 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
  • サンプルコードをいくつか挙げてください
int main()
{
    
    
   //代码1
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
	//代码2
   //if (a = b + 1, c = a / 2, d > 0)
   //代码3
  //a = get_val();
  //count_val(a);
  //while (a > 0)
  //{
    
    
  //	
  //		//业务处理
  //		a = get_val();
  //	count_val(a);
  //}
  //如果使用逗号表达式,改写:
  //while (a = get_val(), count_val(a), a > 0)

	return 0;
}
  • 上記のコードを理解するのが難しい場合は、自分で実行してみるのも良いでしょう。, ここでは詳しく説明しません。

要約する

  • 今日の内容は一旦ここで終了です 今日は関係演算子、論理演算子、条件演算子、カンマ式の応用と間違いやすいポイントについてお話しました。この分野の知識は暗記する必要があり、繰り返し練習して慣れる必要があります。
  • 以上がオペレーター編その3の内容ですが、他のオペレーターの詳しい解説も近日中にまとめて更新していきますので、お楽しみに!
  • 質問がございましたら、コメント欄またはプライベート メッセージでお問い合わせください。また次回お会いしましょう。

新しいブロガーを作成するのは簡単ではありません。記事の内容が役立つと思われる場合は、離れる前にこの新しいブロガーをクリックするとよいでしょう。皆様の応援が更新の励みになります!

**(Ke Li はブロガーを 3 回連続でサポートするようお願いしています!!! 以下のコメントをクリックして「いいね」を押し、Ke Li を支援するために集めてください)**

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/syf666250/article/details/131435005