こんにちは、またお会いしました。今日で演算子の章は終わりです。一緒に学びましょう
- 論理演算子
&& 論理 AND
|| 論理 OR
ここでは、論理的 and と論理的 or と同様に、ビットごとの and とビットごとの or を区別する必要があります。
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
ビット単位の and およびビット単位またはバイナリの計算、および論理的および論理的または真偽の問題。たとえば、年が閏年であるかどうかを判断したい場合、満たさなければならない最初の条件は 4 の倍数であり、割り切れません。 2つの条件が同時に満たされるので、このように書くことができます。(x%4==0&&x%100==0)
また、うるう年には400で割り切れる条件を満たす必要があります。そして、次の基準を書くことができます。今年は下記の通り閏年となりますx%4==0&&x%100==0||x%400==0
。
ロジックが真であるためには、ロジックとその両方が真である必要があり、ロジックまたはロジックのいずれかが真であれば、ロジックは真になります
- 条件演算子
経験値1 ? exp2 : exp3
exp1 の条件が true の場合は exp2 を実行し、そうでない場合は exp3 を実行します。これは if 関数とよく似ています。
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int max = 0;
if (a > b)
{
max = a;
}
else
{
max = b;
}
printf("%d", max);
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int max = a > b ? a: b;
printf("%d", max);
return 0;
}
どちらのコードも同じように機能しますが、明らかに 2 番目のコードの方が少し単純に見えます。
- カンマ式
exp1、exp2、exp3、expn
カンマ式は、カンマで区切られた複数の式です。
カンマ式は左から右に順番に実行されます。式全体の結果は、最後の式の結果になります。
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d", c);
return 0;
}
順番に数えさえすれば、結果を計算できます
カンマ式にはコードを最適化する効果もあります
-
添字参照、関数呼び出し、構造体メンバー
-
[ ][ ] 添字参照
演算子 オペランド: 配列名 + インデックス値
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
[ ]的两个操作数是arr和9。
- ( ) 関数呼び出し演算子は
1 つ以上のオペランドを受け入れます。最初のオペランドは関数名で、残りのオペランドは関数に渡されるパラメーターです。
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //实用()作为函数调用操作符。
test2("hello bit.");//实用()作为函数调用操作符。
return 0;
}
- 構造体のメンバーにアクセスする
構造体 メンバー名
-> 構造体ポインタ -> メンバー名
これら 2 つの記号の使用方法を説明するための例を示します。
これから学生の情報を作成します。最初に名前があり、次に年齢があり、次に性別を定義するため、次の構造を使用する必要があります。ここでは本体が構造体です。
#include<stdio.h>
struct student
{
char name[20];//放名字
int age;//放年龄
char sex[5];//放性别
};
int main()
{
struct student s1 = {
"张三",18,"男" };
printf("%s %d %s", s1.name, s1.age, s1.sex);
return 0;
}
これが私たちの使用法です。次に、同じコードの使用方法を見ていきます ->
#include<stdio.h>
struct student
{
char name[20];//放名字
int age;//放年龄
char sex[5];//放性别
};
int main()
{
struct student s1 = {
"张三",18,"男" };
//printf("%s %d %s", s1.name, s1.age, s1.sex);
struct student* ps1=&s1;
printf("%s %d %s", ps1->name, ps1->age, ps1->sex);
return 0;
}
ここの構造がわからなくても大丈夫です、後で話します、前にも言いましたので振り返ってください
- 式の評価
式が評価される順序は、演算子の優先順位と結合性によって部分的に決まります。
同様に、一部の式のオペランドは、評価中に他の型に変換する必要がある場合があります。
- .1 暗黙的な型変換
C の整数算術演算は常に、少なくともデフォルトの整数型の精度で実行されます。
この精度を実現するために、式内の文字オペランドと短整数オペランドは、使用前に単純な整数型に変換されます。この変換は、整数昇格と呼ばれます。
整数昇格の重要性 式の
整数演算は、CPU の対応するコンピューティング デバイスで実行する必要があります CPU の整数演算ユニット (ALU) のオペランドのバイト長は、一般に int のバイト長です
。 CPU の汎用目的 レジスタの長さ。
したがって、2 つの char 型の加算が実際に CPU によって実行される場合でも、最初に CPU で整数オペランドの標準長に変換する必要があります。
汎用 CPU (汎用 CPU) では、8 ビット 2 バイトを直接加算することは困難です (
機械語命令にはそのようなバイト加算命令があるかもしれませんが)。したがって、長さが int の長さよりも小さい可能性がある式内のさまざまな整数値は、演算を実行するために CPU に送信される前に int または unsigned int に変換される必要があります。
例を挙げてみましょう
#include<stdio.h>
int main()
{
char c1 = -1;
printf("%d", c1);
return 0;
}
//負の整数プロモーション
char c1 = -1;
変数 c1 のバイナリ ビット (補数コード) には 8 ビットしかありません:
1111111
char は符号付き文字であるため、
プラスチック プロモーションが実行されると、上位ビットが符号を補完しますビット (1)
ブースト後の結果は次のようになります:
111111111111111111111111111111
整数の整数プロモーション
char c2 = 1;
変数 c2 のバイナリ (補数コード) には 8 ビットしかありません:
00000001
char は signed char であるため
、プラスチックがプロモートされると、上位ビットに符号ビット (0) が追加されます
。昇格後の結果は:
00000000000000000000000000000001
符号なしの数値はゼロで埋めるだけでよいことに注意してください。
2 算術変換
演算子のオペランドの型が異なる場合、一方のオペランドを他方のオペランドの型に変換しないと演算を実行できません。以下の階層は通常の算術変換と呼ばれます。
オペランドの型が上記のリストの下位にランクされている場合、まず演算を他のオペランドの型に変換する必要があります。
警告:
ただし、算術変換は合理的である必要があります。そうしないと、潜在的な問題が発生します。
float f = 3.14;
int num = f;//隐式转换,会有精度丢失
演算子のプロパティ
複雑な式の評価に影響を与える要素が 3 つあります。
- 演算子の優先順位
- 演算子の結合性
- 評価の順序を制御するかどうか。
したがって、式の評価部分は演算子の優先順位によって決まります。
今日の共有はここまでです。また次回お会いしましょう