記事ディレクトリ
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;
}
注意:
- 区分,斜杠:“/” 与 反斜杠:“” ,此处不可互换。
- \xhh 十六进制转义不限制字符个数 ‘\x000000000000F’ == ‘\xF’ 。
- "\n"表示两个字符占用一个字节。其他类似