C言語学習の演算子(3)


1. 算術演算子

オペレーター 説明 説明する
+ 加算演算子 a+b=c
- 減算演算子 ab=c
* 乗算演算子 a*b=c
/ 除算演算子 a/b=c
% 剰余演算子 a%b=c、剰余演算子の左側と右側は整数でなければなりません

2、シフト演算子

ビット単位の演算子には、右シフトと左シフトが含まれます。整数に対してのみ機能します。
右シフト演算子には、算術右シフトと論理右シフトが含まれます。

1、算术右移为:右边丢弃,左边补原符号位
2、逻辑右移为:右边丢弃,左边补0

左へのシフトは左側で破棄され、右側に 0 が追加されます。

オペレーター 説明 説明する
>> 右シフト演算子 移動するのはバイナリビットです。a >> 1、右に 1 ビットシフトすることは 2 で割ることと同じです
<< 左シフト演算子 移動するのはバイナリビットです。a << 1、1 ビットを左にシフトすることは 2 を乗算することと同じです

注: シフト演算子の場合、負のビットをシフトしないでください。これは標準では定義されていません。例えば:

int num=10;
num >> -1; // 错误

3. ビット演算子

オペレーター 説明 説明する
& ビットごとの AND 2 進数のビットで演算し、両方が 1 の場合は 1、それ以外の場合は 0
| ビットごとまたは 二項演算により、1があれば1、0があれば0
^ ビット単位の XOR 2 進数のビット演算により、対応するビットは 0 と同じで、その差は 1 になります。

注: オペランドは整数でなければなりません

& 操作の例:

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

int c = a&b; //&运算后的c为:00000000000000000000000000000001 结果为1

printf("%d", c); // 结果为1

    return 0;
}

| 操作例:

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

int c = a|b; //|运算后的c为:00000000000000000000000000000111 结果为7

printf("%d", c); // 结果为7

    return 0;
}

^ 演算子の例:

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

int c = a^b; //^运算后的c为:00000000000000000000000000000110 结果为6

printf("%d", c); // 结果为6

    return 0;
}

3.1 変数の値を交換する

3 番目の変数に頼らずに 2 つの変数の値を交換する

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

printf("交换前:a=%d, b=%d\n", a, b);

// a^b的结果为:00000000000000000000000000000110 十进制为:6,此时a等于6。
a = a^b; 
// 此时a等于6,二进制为:00000000000000000000000000000110 
//     b等于5,二进制为:00000000000000000000000000000101
// 再次与b异或的结果为:00000000000000000000000000000011 十进制为:3
// 将结果赋值给b,此时b的结果为3
b = a^b;    
// 此时a等于6,二进制为:00000000000000000000000000000110 
//     b等于3,二进制为:00000000000000000000000000000011
// 再次异或的结果为:00000000000000000000000000000101 十进制为:5
// 将结果赋值给a,完成a与b的交换
a = a^b;

printf("交换后:a=%d, b=%d", a, b); // 结果a为5,b为3

    return 0;
}

4 番目、代入演算子

代入演算子は実際には等号「=」です。プログラムでは 1 つの等号が代入演算子を表し、2 つの等号「==」が等号を表します。

オペレーター 説明 説明する
= 代入演算 左側の値が右側の値と等しいということではなく、右側の値が左側に割り当てられていることを示します。
int a = 3;  //表示将3赋值给a,此时a的值就是3

5、複合演算子

オペレーター 説明 説明する
+= に等しいものを追加します a += b は a= a + b と同等です
-= マイナスに等しい a -= b は a= a - b と同等です
*= に等しい乗算 a *= b は a= a * b と同等です
/= 等しい除算 a /= b は a= a / b と同等です
%= モジュロは次と等しい a %= b は a= a % b と同等です
>>= 右シフトは次と等しい a >>= b は a= a >> b と同等です
<<= 左シフトは次と等しい a<<= b は a= a << b と同等です
&= そして等しい a &= b は a= a & b と同等です
|= または等しい a |= b は a= a | b と同等です
^= 排他的または等しい a ^= b は a= a ^ b と同等です

6、単項演算子

6.1 演算子の概要

オペレーター 説明 説明する
論理逆 true が false になり、false が true になります。a が true の場合、!a は false
- 負の値 -1、-3など
+ 正の値 +1、+3など
& 住所を取る &a は変数のアドレスを取り出すことを意味します
のサイズ オペランドの型の長さ バイト単位で
数値のビット単位の逆数 例を参照
- - デクリメント フロントリア - -
++ 自己追加 フロント、リア++
* 間接アクセス演算子 (逆参照演算子) 例を参照
(タイプ) キャスト (int)float_num

6.2 演算子の例

6.2.1 * 逆参照演算子の例

#include <stdio.h>

int main(){
    
    

int a = 10;

int* p = &a; //将a的地址赋值给指针变量p
*p = 20;  // *为解引用操作符。表示通过p找到a

printf("a的值为:%d", a);   //a的值为20

    return 0;
}

6.2.2 ~ 否定演算子の例

#include <stdio.h>

int main(){
    
    

int a = 0;

// a的二进制为:00000000000000000000000000000000
// 11111111111111111111111111111111 为a的补码
// 11111111111111111111111111111110 反码
// 10000000000000000000000000000001 源码值为-1
printf("a的值为:%d", ~a);   //a的值为-1

    return 0;
}

6.2.3 加算と減算

分類:

前自增	-- ++i
后自增	-- i++

相同点:最终都使 i 的值加1
不同点:前自增整体表达式的值是 i 加1之后的值。后自增整体表达式的值是 i 加1之前的值。

前- -同理

6.2.3.1 Ex++の使用例

#include <stdio.h>

int main(){
    
    

int a = 10;

// ++放在前面,先++,后使用
printf("a的值为:%d", ++a);   //a的值为11

    return 0;
}

6.2.3.2 post++ の使用例

その後 - - 同じ理由

#include <stdio.h>

int main(){
    
    

int a = 10;

// ++放在后面,先使用,再++
printf("a的值为:%d", a++);   //a的值为10

    return 0;
}

6.2.3.3 包括的な使用例

#include <stdio.h>

int main(void)

{
    
    
	int i, j, k, m;
	i = j = 3;
	k = ++i;
	m = j++;
	printf("i = %d j = %d k = %d m = %d", i, j, k, m);
	return 0;
}
i = 4 j = 4 k = 4 m = 3

6.2.4 必須の型変換

文法:

(数据类型)(表达式)

関数:

把表达式的值强制转化为前面所执行的数据类型

在这里插入图片描述

6.2.4.1 必須の型変換の例

#include <stdio.h>

int main(){
    
    

// 3.14为double类型,赋值给int的a精度丢失,且报警告
// 使用(int)3.14可以将3.14强制转换成int类型
int a = (int)3.14;
printf("%d", a);    // a的值为3
    return 0;
}

7. 関係演算子

オペレーター 説明 説明する
> 以上 a > b
>= 以上 a >= b
< 未満 a < b
<= 以下 a <= b
!= 等しくない a != b
== 同等 a == b

8. 論理演算子

オペレーター 説明 説明する
&& ロジックと 両方が true の場合は true、どちらか 1 つがゼロの場合は false です。左側の計算が偽の場合、右側は計算されなくなります
|| 論理的または 両方が false の場合は false、どちらか一方が true の場合は true です。左辺が true と評価されると、右辺は評価されません

8.1 ロジックと例

#include <stdio.h>

int main(){
    
    

int a = 3; // a为非零,则为真
int b = 2; // b为非零,则为真

int c = a && b; // a && b 则同为真则为真,反之为零。

printf("%d", c);	// 结果为:1
    return 0;
}

8.2 論理和の例

#include <stdio.h>

int main(){
    
    

int a = 3; // a为非零,则为真
int b = 0; // b为零,则为假

int c = a || b; // a || b 则同为假则为假,有一个为真则为真。

printf("%d", c); // 结果为:1
    return 0;
}

8.3 面接の質問例

#include <stdio.h>

int main(){
    
    

int i=0, a = 0, b = 2, c = 3, d = 4;

// 运算a++时,为先赋值再运算,则a等于0。
// 当a等于0时,后面不管什么整个表达式都为假,后面不再运算。
// 然后a再自加1
i = a++ && ++b && d++;
printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=1, b=2, c=3, d=4

    return 0;
}
#include <stdio.h>

int main(){
    
    

int i=0, a = 1, b = 2, c = 3, d = 4;

// 运算a++时,为先赋值再运算,则a等于1。
// 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
// 然后a再自加1
i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=2, b=2, c=3, d=4

    return 0;
}

9、条件演算子(三項演算子)

オペレーター 説明 説明する
経験値1 ? 経験値2?:exp3 条件演算子 如果exp1为真,则exp2为整个表达式的结果。如果exp1的结果为假,则exp3为整个表达式的结果

9.1 条件操作符示例

#include <stdio.h>

int main(){
    
    

int i = 0, a = 4, b = 3;

// 当a大于b时,输出a,反之输出b
// 相当于:
// if(a > b){
    
    
//     i = a;
// }else{
    
    
//     i = b;
// }
i = a > b ? a : b;
printf("i=%d", i); // 结果为i=4

    return 0;
}

十、逗号表达式

表达式 说明
exp1, exp2, exp3, … expN 逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

10.1 逗号表达式示例

#include <stdio.h>

int main(){
    
    

int i=0, a = 1, b = 2, c = 3, d = 4;

// 运算a++时,为先赋值再运算,则a等于1。
// 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
// 然后a再自加1
i = (a > b, a = b + 10, a, b = a + 1); // 逗号表达式
printf("i=%d", i); // 结果i=13

    return 0;
}

十一、结构体成员操作符

操作符 解释 说明
. 结构体成员操作符 结构体 . 成员名
-> 结构体指针操作符 结构体指针->成员名

11.1 结构体成员操作符示例

#include <stdio.h>

// 结构体
struct Student
{
    
    
    char name[20];
    int age;
    char gender[8];
};


int main(){
    
    

    // 创建结构体对象
    struct Student s1 = {
    
    "张三", 12, "男"};

    // 打印其中结构体对象中属性的值
    //s1.gender为取到结构体对象中gender的值
    // 结构体对象.成员名
    printf("%s", s1.gender);    // 结果为:男

    return 0;
}

11.2 结构体指针操作符示例

#include <stdio.h>

// 结构体
struct Student
{
    
    
    char name[20];
    int age;
    char gender[8];
};


int main(){
    
    

    // 创建结构体对象
    struct Student s1 = {
    
    "张三", 12, "男"};

    // 将s1的地址赋值给ps,因为指针变量可以接收地址
    // 所以ps的类型为Student的指针类型,
    struct Student* ps = &s1;
    // -> 操作符可以使指针指向对象的成员属性
    printf("%s", ps->name);    // 结果为:张三

    return 0;
}

十二、转义字符

转义字符,所有的ASCII码都可以用 “ \ ” 加数字(一般是8进制数字)来表示。而C中定义了一些字母前加 “” 来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

在这里插入图片描述

// \ddd表示1到3位的八进制所代表的任意字符 示例
#include <stdio.h>


int main() {
    
    

	// '\46'在ASCII表中代表的时&,所以输出的结果为:&
    printf("%c\n", '\46'); // 输出结果为:&
    // '\044'在ASCII表中代表的时&,所以输出的结果为:$
    printf("%c\n", '\044'); // 输出结果为:$

    return 0;
}
// \xhh表示十六进制所代表的任意字符 示例
#include <stdio.h>

int main() {
    
    

	// '\x25'在ASCII表中代表的时%,所以输出的结果为:%
    printf("%c\n", '\x25'); // 输出结果为:%
   
    return 0;
}

注意:

  1. 区分,斜杠:“/” 与 反斜杠:“” ,此处不可互换。
  2. \xhh 十六进制转义不限制字符个数 ‘\x000000000000F’ == ‘\xF’ 。
  3. "\n"表示两个字符占用一个字节。其他类似

十三、运算符优先级

在这里插入图片描述

おすすめ

転載: blog.csdn.net/qq_46292926/article/details/127562333