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

news2024/11/19 14:34:05

文章目录

    • 第一节:条件运算符与逗号运算符
      • 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. 异或运算符实例解析

异或运算符有两个特性:

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Bigemap计算挖填土石方量

1、 Bigemap GIS Office 第一步&#xff1a; 用Bigemap GIS Office导出待计算区域的高程数据&#xff1a; 1.1 打开Bigemap GIS Office选择目标区域&#xff1a;如下图&#xff1a; 1.2选择的目标区域的高程数据&#xff08;NASA, TIF, 高精度高程数据&#xff09; 1…

【SSM框架】MyBatis核心配置文件详解

1.MyBatis核心配置文件之environments <!--environments&#xff1a;配置多个连接数据库的环境 属性&#xff1a;default&#xff1a;设置默认使用的环境的id --><environments default"development"><!--environment&#xff1a;配置某个具体的环境 …

C++ opencv形态学、轮廓查找、特征检测和图像分割

C opencv形态学、轮廓查找、特征检测和图像分割形态学基本处理方法二值化全局二值化局部二值化腐蚀和膨胀图像形态学运算开运算闭运算顶帽黑帽代码图像轮廓寻找轮廓绘画轮廓轮廓的面积和周长多边形逼近和凸包多边形逼近凸包外接矩形最小外接矩形最大外接矩形案例车辆检测&#…

召回和排序模型中的用户行为序列的建模

1. 概述 用户在使用一个APP或者浏览网页的过程中&#xff0c;都是由一些行为构成的&#xff0c;以资讯类为例&#xff0c;通常对一个帖子感兴趣&#xff0c;对于感兴趣的帖子&#xff0c;通常会点击进入查看&#xff0c;或者点击收藏或者对其进行评论&#xff0c;这一系列行为…

电脑录屏怎么录全屏?win10电脑如何录屏

随着互联网的发展&#xff0c;线上办公以及网课越来越频繁&#xff1b;线上办公或者网课都是使用电脑来完成工作和学习的&#xff1b;那Win10电脑如何录屏以及电脑录屏怎么录屏全屏呢&#xff1f;接下来给大家分享三个电脑录制全屏的教程方法给大家&#xff1b; win10录制全屏方…

【MySQL】绿色版下载配置教程(Windows)

文章目录下载MySQL压缩包1 创建my.ini文件2 配置mysql环境变量3 在终端执行命令下载MySQL压缩包 https://dev.mysql.com/downloads/mysql/ 1 创建my.ini文件 模板内容如下 [mysqld] basedir D:\\Program Files\\mysql # 设置mysql的安装目录 datadir D:\\Program Files\\m…

红黑树简介

一、红黑树 1、概念 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉搜索树。它在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red或 Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其…

为什么生产MES系统对工厂管理如此重要?

随着生产业务、计算机技术的发展&#xff0c;MES管理系统的定义也是在不断的变化。但是&#xff0c;计划调度、质量管理、生产执行以及数据&#xff08;设备&#xff0c;产品信息&#xff09;采集&#xff0c;一直都是MES的核心功能。 工业物联网&#xff0c;对于制造业来说并…

数据结构--顺序表、链表、栈、队列、树、文件(visual studio可运行)

顺序表的顺序存储&#xff08;增删查&#xff09; #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef int ElemType;//保证顺序表可以存储任何类型 //静态分配 typedef struct{ ElemType data[MaxSize];//定义的数组&#xff0c;用来存元素…

MergeTree写入查询流程分析

基础概念回顾 前面几节我们分别详细分析了分区&#xff0c;索引&#xff0c;数据存储相关原理&#xff0c;这些组件配合在一起给Clickhouse数据库带来非常高效的查询性能。前面的文章也单独介绍了这几个组件。接下来&#xff0c;就分别从写入过程、查询过程&#xff0c;以及数…

数字孪生水电站,三维组态助力发电流程优化

从大禹治水到三峡大坝的建造&#xff0c;人类为控制和调配自然界的地表水和地下水&#xff0c;修建了许多的水利工程。对水资源进行了广泛的开发利用&#xff0c;诸如农业灌溉、工业和生活用水、水力发电、航运、港口运输、淡水养殖、旅游等。 将图扑软件与 GIS、粒子仿真、虚拟…

在re:Invent 2022大会打球、喝酒?没错!

编辑&#xff5c;阿冒虽然距离去拉斯维加斯参加亚马逊云科技re:Invent 2022大会&#xff0c;差不多已经过去了一个月&#xff0c;不过时不时仍有熟稔的朋友来问我&#xff0c;你在展区球场上如何如何&#xff0c;巴拉巴拉……为啥他们对我的行动如此了解&#xff1f;其实&#…

effective C++读书笔记

目录 用const,enum,inline去替换#define 尽可能去使用const 确保对象使用前已被初始化 这是effective C中的第一大章节&#xff1a;让自己习惯c 用const,enum,inline去替换#define 当用使用这样的代码&#xff1a; #define ASPECT RATIO 1.653 记号名称ASPECT RATIO可能未…

图像风格迁移---基于多适应网络的任意风格传输

ABSTRACT 任意风格转换是一个具有研究价值和应用前景的重要课题。给定一个内容图像和引用的风格绘画&#xff0c;一个所需的风格转换将使用风格绘画的色彩色调和生动的笔画模式渲染内容图像&#xff0c;同时保持详细的内容结构信息。风格迁移方法首先学习内容和内容和风格引用…

推荐系统的矩阵分解

0 序言 推荐系统中基于内容的协调过滤算法通过用户之间的相似性或者物品之间的相似性&#xff0c;通过相似性来为用户做决策和推荐&#xff1b;基于内容的协调过滤算法在实际生产环境中&#xff0c;User或Item的数据量非常大&#xff08;百万级别&#xff09;&#xff0c;存储…

操作系统期末考试必会题库3——处理机调度

1、假设一个系统中有5个进程&#xff0c;它们处于就绪状态的时刻和估计运行时间如下表所示&#xff0c;忽略I/O以及其它开销时间&#xff0c;若分别按先来先服务&#xff0c;最短进程优先&#xff0c;最短剩余时间优先、响应比优先、时间片轮转&#xff08;时间片&#xff1d;1…

世界杯 | 其实世界杯结束之前,卡塔尔就开拆体育场了...

大家好&#xff0c;这里又是建模助手。 世界杯已经圆满落幕&#xff0c;梅老板满载而归&#xff0c;但阿根廷与法国的这场世界杯决赛注定载入史册&#xff0c;成为永恒经典&#xff0c;或许将会是世界杯历史上最精彩的决赛之一。 &#xff08;梅老板捧起大力神杯那一刻&#x…

人工鱼群算法参数寻优及可视化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 人工鱼群优化算法是一种基于模拟鱼群行为的优化算法&#xff0c;是由李晓磊等在2002年提出的一种新型的寻优算法。人工鱼群主要…

黑马Hive+Spark离线数仓工业项目--数仓事实层DWB层构建(1)

整体目标&#xff1a;构建数仓中的DWB&#xff1a;主题事务事实表 核心的主题事实的构建&#xff1a;SQL实现 主题的指标 原始事务事实数据【DWD】&#xff1a;订单数据 主题事务事实数据【DWB】&#xff1a;订单主题 - 主题周期快照事实表&#xff1a;数据应用层【ST&#…

一场4800亿“锂电”战事,瑞浦兰钧射出三支“价值之箭”

顺势而为&#xff0c;是一家企业成功突围的最佳利器。 如今&#xff0c;几乎所有企业都被“碳达峰碳中和”的国家级战略所影响。在此大势的推动之下&#xff0c;锂离子电池、清洁能源等产业也随之进入高速发展期。工信部数据显示&#xff0c;上半年全国锂离子电池产量超过280G…