1つの入力、1つの出力
1.1 出力機能
printf 関数は可変パラメータ関数であり、パラメータの数は可変です: int printf(const char *format, ...)
printf("%d\n", x);
printf("%d %d\n", x, y);
1.2 入力機能
1.2.1 scanf 関数: int scanf(const char *format, ...)
scanf 関数は、標準入力から入力を読み取り、指定された形式に従って入力を参照します。
1.2.2 getchar 関数: int getchar(void)
int getchar (void) 関数は、次に使用可能な文字を画面から読み取り、それを整数として返します。
#include <stdio.h>
int main(){
//输入数值
int x = 2;
printf("please upload a number\n");
//scanf("%d:", &x);
printf("%d\n", x);
//输入字符,只能一次捕获一个字符
char y='d';
//scanf("%c\n", &y);
printf("y: %c\n", y);
//连续输入多个值
int a=2, b=8;
char c='l';
scanf("%d %d %c", &a, &b, &c);
printf("a:%d and b:%d and c:%c\n", a, b, c);
//getchar 继续输入字符
getchar(); //获取下一个可用字符
char d='k';
scanf("%c", &d);
printf("upload d data:%c", d);
return 0;
}
二項演算子と式
2.1 演算子と式の概念
1演算子は、コンパイラに特定の数学的演算または論理演算を実行するように指示するシンボルです。C 言語には豊富な組み込み演算子があり、次の種類の演算子が提供されています。
2 式とは被演算子(オペランド)を演算子で結んだ式のことで、式と呼ばれます。
a+b, x=a+2, x=y>z, x++
3. 演算子は演算子とも呼ばれ、演算子が演算するオペランドの数により以下の種類に分けられます。
- 単項演算子: 必要なオペランドは 1 つだけです
- 二項演算子: 2 つのオペランドが必要です
- 三項演算子: 3 つのオペランドが必要です
4. 演算子の優先順位
- ! > 算術演算子 > 関係演算子 > && > || > 条件演算子 > 代入演算子 > カンマ演算子
5. 演算子の結合性
演算子の結合性は、式の実行時に演算子が左および右のオペランドと結合される順序です。演算子の結合性は次のように分類されます。
- 単項演算子: オペランドが左か右かに応じて、左結合と右結合に分けられます。
- 二項/三項演算子: 左から右または右から左
2.2 算術演算子
1. C 言語の組み込み算術演算子は次のとおりです。
2. 注: %モジュロ(剰余)演算子の 2 つのオペランドは整数のみです。
3. 注: 前置インクリメント/前置デクリメントは参照前に計算され、後置インクリメント/後置デクリメントは計算前に参照されます。
2.3 代入演算子
C 言語にはいくつかの組み込み代入演算子があります。
注: 「=」は等しいという意味ではなく、代入を意味します。
専門用語:データ オブジェクト、左辺値、右辺値
- 代入式文の目的は値をメモリに格納することであり、値を格納するためのデータ格納領域を総称してデータオブジェクトと呼びます。
- 「左辺値」 (lvalue) は、特定のデータ オブジェクトを識別するために使用される名前または式を指します。
- 左辺値には 2 つのプロパティがあります。
- 1.変更可能性(変更可能な左辺値とも呼ばれます)
- 2. これはデータオブジェクトの識別子であり、識別子の特性を持つ必要があります。
- 3.左辺値を定数にすることはできません
- 注: 左辺値を定数にすることはできません
- 左辺値には 2 つのプロパティがあります。
- 「右辺値」とは、変更可能な左辺値に割り当てることができる量を指します。
×+100
y = 200
y = X
y = X+200
//从上面几个表达式我们可以看出:右值可以是常量可以是变量,也可以是任何可以产生一个值的表
//达式(当然任何表达式最终都有一个最终的值)
c + 1 = 10 //是错误的
2.4 関係演算子
関係演算子は 2 つの値間の関係を比較するために使用されるため、比較演算子 とも呼ばれます。
C 言語には、次の組み込みの関係演算子があります。
注: 代入演算子「=」と関係演算子「==」の違い
2.5 論理演算子
2.5.1 論理演算子のインポート
- 関係演算子を学習するとき、関係演算式の結果は 0 と 1 のみであることを思い出してください。2つの値の間に一定の関係が成立するかどうかを判断する際に、なぜ0/1で表す必要があるのでしょうか?
- コンピューターは 2 つのロジックを使用して 2 つの値間の関係を表します。
- 論理真 (関係が確立): 非ゼロ
- 論理偽(関係が成り立たない): 0
- プログラムをデバッグする際、2つの値の関係を鮮やかに表現するために、C言語ではコンピュータの中で最も単純な2つの値、0と1を使って記述します。プログラムのデバッグ時に出力結果が 0 であれば、判断した関係が真ではないことを意味し、それ以外の場合は真を意味します。
- 注: 1 は「true」ですが、「true」は 1 ではありません。学習しましたか? ^_^
2.5.2 論理演算子の使用
1. 実際のアプリケーションでは、特定の条件が真かどうかを判断するために複数のロジックを組み合わせる必要があることがよくあります。
2. C 言語で、複数のロジックを組み合わせて式を形成する必要がある場合は、C 言語の組み込み論理演算子を使用する必要があります。
3. 生徒の成績が良いか悪いかを判断するには、C 言語で次の式を使用します。
x>=60 && x<=70
4. バレンタインデーが近づいてきました、あなたはガールフレンドに尋ねます: プレゼントは何が欲しいですか? ガールフレンドは私に口紅かフェイスマスクの箱を買ってくれると言っています? ガールフレンドのリクエストに応えるには何をすべきですか? 毛糸の布?
- 口紅を買う||マスクを買う
5. ガールフレンドが口紅とマスクの両方を欲しがったらどうしますか?
- 口紅を買ってマスクも買う
2.6 ビット演算子
2.6.1 ビット演算の基本的な使い方
1. ビット演算とは、バイナリで実行される演算を指します。2. すべてのコンピューター計算は、最終的には 2 進数のビット演算を通じて実行されます。3. ソフトウェア開発プロセスでは、多くの場合、次のようなバイナリ問題に対処する必要があります。
- ワンチップマイコンSTM32などにより照明やファンなどを制御します。
- サブネットマスクからIPアドレスのネットワーク番号を調べる
- XOR によるデータの暗号化
- ビット演算によるデータのパリティ判定(x & 1)
4. C 言語の組み込みビット演算子はのとおりです。
2.6.2 ビット演算の「表示演算」
1.乗算を行うための左シフト
- n ビット左にシフトすることは、2 の n 乗を乗算することと同じです。
int x;
x = 2;
x = x << 2;
x = x << 3
2.右にシフトして分割を達成する
- n ビット右シフトは、2 の n乗で割ることと同じです。
int x = 100;
x = x >> 1;
x = x >> 3;
3.中間変数を使用せずに2 つの整数変数の値を交換する
int a = 5, b = 6;
a = a+b;
b = a-b;
a = a-b;
上記のコードは2つの整数変数の値を交換できるように見えますが、特にaとbが大きい場合には範囲を超えてしまう可能性があります。
int a = 5, b = 6;
a = a ^ b;
b = a ^ b;
a = a ^ b;
4.整数のパリティの判定
x & 1
5.上位ビットと下位ビットを交換するビット操作
a = (a >> 8) | (a << 8);
6. レジスタ設定
- 組み込みシステムでは、常にユーザーが変数またはレジスタ (8 ビット) に対してビット操作を実行する必要があります。変数 a が与えられた場合、a の 3 番目のビットを 1 (ビットの右端のビットは 0) に設定し、他のビットの値は変更されません。
a = a | 0x08
- 3 番目のビットをゼロにクリアし、他のビットは変更しないでください。
a = a & (~0x08)
7. データの「分解」
- データ送信のプロセスでは、整数データを逆アセンブルする必要があります。たとえば、int x = 0x1m2345678 の場合、送信するには x を 0x12 0x34 0x56 0x78 に逆アセンブルする必要があります。
x & 0xFF
(x >> 8) & 0xFF
(x >> 16) & 0xFF
(x >> 24) & 0xFF
8. データの「組み立て」
- 逆アセンブルされたデータ 0x12 0x34 0x56 0x78 を取得したとします。それが 0x12345678 にアセンブルされたらどうなるでしょうか。
x = 0x12<<24 | 0x34<<16 | 0x56<<8 | 0x78
#include <iostream>
int main() {
//算术运算符,乘法计算结果
int x = 11;
float y = 3.0;
float z = x * y;
printf("view data z:%f\n", z);
//除法计算结果
int a =10, b=3;
float c = a/b; //整型数据相除为整型数据
float m = 3.0;
float d = a/m; //整型数据和浮点数相除为浮点数
printf("view data c:%f\n", c);
printf("view data d:%f\n", d);
//printf("10/0:%f\n", 10/0); //C语言中不容许除0的操作,会报错
//printf("10%3.3:%d\n", 10%3.3); //取模(取余操作)操作只能在整数和整数之间,不然会报错
//前自增运算符的使用
a = 2;
printf("view add front result, ++a:%d\n", ++a); //自己会增加
b = ++a;
printf("view add front result, a:%d, b:%d\n", a, b); //自己增加然后赋值操作
//后自增运算符的使用
a = 2;
//printf("view add front result, a++:%d\n", a++); //自己不会增加
b = a++;
printf("view add front result, a:%d, b:%d\n", a, b); //在原值基础上+1赋值
//算术运算符
a=2, b= 3+1;
printf("view a:%d and b: %d\n", a, b);
printf("view result a==b:%d\n", a==b); //0
printf("view result a!=b:%d\n", a!=b); //1
printf("view result a>b:%d\n", a>b); //0
printf("view result a<b:%d\n", a<b); //1
//逻辑运算符
a = 2;
printf("a:%d, logic %d\n", a, a>=4); //C语言不可以使用 1<=a<=5的形式
//逻辑非
printf("!a: %d\n", !a); //0
//逻辑与
printf("a&b: %d\n", a<=5 && b<=5); //1
//逻辑或, 一个为真就是真
printf("a||b: %d\n", a<=5 || b<=1); //1
//位运算符
char A = 60;
char B = 30;
// 与运算
printf("A & B: %d\n", A & B); //28
//或运算 00为0 , 11为0, 1+任意值为1
printf("A | B: %d\n", A | B); //62
//异或运算 ^, 相同为0, 不同为1
//0和任意值异或得任意值, 1和任意值异或得任意值取反
printf("B^A: %d\n", B ^ A); //34
//按位取反 ~
printf("~A:%d\n", ~A); //-61
return 0;
}
2.7 カンマ演算子
1. カンマ演算子は 2 つの式を連結します
- 式 1、式 2
2. カンマ演算子の結合性は「左から右」です。最初に式 1 を計算し、次に式 2 を計算します。
a = 3;
b = a*2, a+4;
3. 式全体の最終値は式 2 の値になります。
2.8条件演算子
1. 条件演算子は、疑問符「?」とコロン「;」で接続された式です。
- 式 1 ? 式 2 : 式 3
2. 実行ロジック
- 式全体の結果は、式 1 の結果が true の場合は式 2 の結果となり、それ以外の場合は式 3 の結果になります。
3. 例
- printf ("%d\n", 3>4?3:4 ); //最大値を取得します