文章目录
- 第一节:条件运算符与逗号运算符
- 1. 条件运算符
- 2. 逗号运算符
- 第二节:自增自减运算符
- 1. 自增自减运算符
- 2. 自增自减运算符与取值运算符
- 第三节:位运算符
- 1. 位运算符
- 2. 异或运算符实例解析
- 第四节:switch和do while讲解
- 1. switch语句
- 2. do while 语句
- 第五节:二维数组和二维指针
- 1. 二维数组
- 2. 二维指针
第一节:条件运算符与逗号运算符
1. 条件运算符
三目运算符代表有三个操作数。
三目运算符通过判断问号之前的表达式的真假,来确定整体表达式的值。
#include <stdio.h>
int main() {
int a,b,max;
while (scanf("%d%d",&a,&b)){
max=a>b?a:b;
printf("max=%d\n",max);
}
return 0;
}
F:\Computer\Project\practice\19\19.1-operator\cmake-build-debug\19_1_operator.exe
2 3
max=3
6 5
max=6
2. 逗号运算符
逗号运算符的优先级最低,我们需要掌握的是,逗号运算符的整体值是最后一个表达式的值。
#include <stdio.h>
int main() {
int i,j;
i=10;
j=1;
if(i,j-1){ // 并不会进入if,因为逗号表达式整体的值是最后一个表达式的值。1-1=0,为假。如果写成j-1以外的情况会进入
printf("if excute\n");
}
return 0;
}
F:\Computer\Project\practice\19\19.1-comma\cmake-build-debug\19_1_comma.exe
进程已结束,退出代码为 0
逗号表达式常见的场景是for循环表达式中初始化多个变量。
第二节:自增自减运算符
1. 自增自减运算符
自增、自减会改变变量的值,所以自增和自减不能用于常量。
#include <stdio.h>
int main() {
int i=5,j;
j=i++>-1;// 等价于j=i>-1;i++
// j=++i>-1;// 等价于++i;j=i>-1
printf("i=%d,j=%d\n",i,j); // j的值根据判断结果只有0或1两个结果
return 0;
}
"F:\Computer\Project\practice\19\19.2-increasing decreasing\cmake-build-debug\19_2_increasing_decreasing.exe"
i=6,j=1
进程已结束,退出代码为 0
2. 自增自减运算符与取值运算符
#include <stdio.h>
int main() {
int a[5]={2,7,8,10,12};
int *p;
int j;
p=a;
j=*p++; // 先把*p的值赋给j,然后对p加1 相当于j=*p;*p++
printf("a[0]=%d,j=%d,*p=%d\n",a[0],j,*p); // 此时p指向7
j=p[0]++; // 先把p[0]赋给j,然后对p[0]加1 此时p指向8,指向哪个元素哪个元素就是p[0]
printf("p[0]=%d\n",p[0]);
printf("a[0]=%d,j=%d,*p=%d\n",a[0],j,*p);
return 0;
}
F:\Computer\Project\practice\19\19.2-Value\cmake-build-debug\19_2_Value.exe
a[0]=2,j=2,*p=7
p[0]=8
a[0]=2,j=7,*p=8
进程已结束,退出代码为 0
第三节:位运算符
1. 位运算符
位运算符<<、>>、~、|、^、&分别表示左移、右移、按位取反、按位或、按位异或、按位与。
位运算符只能用于对整型数据操作。
左移:高位丢弃,低位补0,相当于乘以2。工作中很多时候申请内存时会用左移,例如要申请1GB大小的空间,可以使用malloc(1<<30)。
右移:低位丢弃,正数的高位补0(无符号数我们认为是正数),负数的高位补1,相当于除以2。移位比乘法和除法的效率要高,负数右移,对偶数来说是除以2,但对奇数来说是先减1再除以2。例如:-8>>1,得到的是-4,但-7>>1得到的并不是-3而是-4。另外,对于-1来说,无论右移多少位,值永远为-1。
异或:相同的数进行异或时,结果为0。任何数和0异或的结果是其本身。
按位取反:数位上的数是1变为0,0变为1。
按位与和按位或:用两个数的每一位进行与和或。
#include <stdio.h>
int main() {
int i=5;
short j;
j=i<<1; // 一个变量移动以后自身不会变化
printf("j=%d\n",j); // 左移是乘以2,结果为10
j=i>>1; // 一个变量移动以后自身不会变化
printf("j=%d\n",j); // 左移是除以2,结果为2
return 0;
}
"F:\Computer\Project\practice\19\19.3-Bitwise operation\cmake-build-debug\19_3_Bitwise_operation.exe"
j=10
j=2
进程已结束,退出代码为 0
#include <stdio.h>
int main() {
short i;
short j;
i=0x8011;
unsigned short s=0x8011; // unsigned表示无符号数,无符号数只能是0或正数
unsigned short r=0;
j=i>>1; // 对i右移,有符号数右移
r=s>>1; // 对s右移,无符号数右移
printf("j=%d,r=%u\n",j,r);
printf("i=%u,s=%u\n",i,s);
return 0;
}
"F:\Computer\Project\practice\19\19.3-Bitwise operation\cmake-build-debug\19_3_Bitwise_operation.exe"
j=-16376,r=16392
i=4294934545,s=32785
进程已结束,退出代码为 0
#include <stdio.h>
int main() {
short i;
short j;
i=5,j=7;
printf("i & j=%d\n",i&j);
printf("i | j=%d\n",i|j);
printf("i ^ j=%d\n",i^j);
printf("~i=%d\n",~i);
return 0;
}
"F:\Computer\Project\practice\19\19.3-Bitwise operation\cmake-build-debug\19_3_Bitwise_operation.exe"
i & j=5
i | j=7
i ^ j=2
~i=-6
进程已结束,退出代码为 0
2. 异或运算符实例解析
异或运算符有两个特性:
- 任何数和0异或得到自身。
- 两个相等的数异或得到0。
如何在一堆数中找出出现1次的那个数?
#include <stdio.h>
int main() {
int i;
int arr[5]={8,5,3,5,8};
int result=0;
for(i=0;i<5;i++){
result ^=arr[i];
}
printf("%d\n",result); // 输出为3
return 0;
}
F:\Computer\Project\practice\19\19.3-characteristic\cmake-build-debug\19_3_characteristic.exe
3
进程已结束,退出代码为 0
第四节:switch和do while讲解
1. switch语句
判断的一个变量可以等于几个值或几十个值时,使用if和 else if语句会导致else if分支非常多,这时可以考虑使用switch语句, switch语句的语法格式如下:
#include <stdio.h>
int main() {
int mon,year;
while (scanf("%d%d",&mon,&year)){
switch (mon) {
case 2:
printf("mon=%d is %d days\n",mon,28+(year%4==0&&year%100!=0||year%400==0));
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("mon=%d is 31 days\n",mon);
break;
case 4:
case 6:
case 9:
case 11:
printf("mon=%d is 30 days\n",mon);
break;
default:
printf("error mon\n");
}
}
return 0;
}
F:\Computer\Project\practice\19\19.4-switch\cmake-build-debug\19_4_switch.exe
2 2000
mon=2 is 29 days
3 2000
mon=3 is 31 days
4 2000
mon=4 is 30 days
2. do while 语句
do while 语句的特点是:先执行一次循环体,然后判断循环条件是否成立。其一般形式为:
计算1到100的和。
#include <stdio.h>
int main() {
int i=1,total=0;
do{
total=total+i;
i++;
} while (i<=100); // 无论这里判断条件是什么,都会执行一次循环
printf("%d\n",total);
return 0;
}
"F:\Computer\Project\practice\19\19.4-do while\cmake-build-debug\19_4_do_while.exe"
5050
进程已结束,退出代码为 0
第五节:二维数组和二维指针
1. 二维数组
二维数组定义的一般形式如下:
例如:定义a为3x4(3行4列)的数组。b为5x10(5行10列)的数组:
可以将二维数组视为一种特殊的一维数组:一个数组中的元素类型是一维数组的一维数组。
例如:可以把二维数组a[3][4]视为一个一维数组,它有3个元素a[0]、a[1]和a[2],每个元素又是一个包含4个元素的一维数组。如图所示:
二维数组中的元素在内存中的存储规则是按行存储,即先顺序存储第一行元素,后顺序存储第二行元素,数组元素的获取依次是从a[0][0]到a[0][1],直到最后一个元素a[2][3]。
如图显示了存储二维数组a[3][4]中每个元素时的顺序。
#include <stdio.h>
int main() {
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
printf("sizeof(a)=%d\n", sizeof(a)); // 掌握二维数组的大小
printf("a[2][3]=%d\n",a[2][3]); // 最后一个元素时a[2][3]
return 0;
}
F:\Computer\Project\practice\19\19.5-array\cmake-build-debug\19_5_array.exe
sizeof(a)=48
a[2][3]=12
进程已结束,退出代码为 0
2. 二维指针
如果掌握了C++的引用,其实不需要去学习二级指针,对于考研必要性很低,二级指针是指针的指针,二级指针的作用是服务于一级指针变量,对一级指针变量实现间接访问。下面我们通过一个实例来让大家理解一下二级指针。
#include <stdio.h>
int main() {
int i=10;
int *p=&i;
int **p2=&p;
printf("sizeof(p2)=%d\n", sizeof(p2)); // p2和p同样大,都是8个字节
printf("**p2=%d\n",**p2); // 通过两次取值可以拿到i
return 0;
}
F:\Computer\Project\practice\19\19.5-er-pointer\cmake-build-debug\19_5_er_pointer.exe
sizeof(p2)=8
**p2=10
进程已结束,退出代码为 0