【408篇】C语言笔记-第十九章(C语言语法进阶)

第一节:条件运算符与逗号运算符

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. 异或运算符实例解析

异或运算符有两个特性:

  1. 任何数和0异或得到自身。
  2. 两个相等的数异或得到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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻啦猫@_@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值