【C语言督学训练营 第十九天】关于C语言语法的一些补充

news/2024/7/8 1:05:01

文章目录

  • 1.条件运算符与逗号运算符
  • 2.自增自减运算符
  • 3.位运算
  • 4.switch do-while补充
  • 5.二维数组&二级指针
  • 6.总结

1.条件运算符与逗号运算符

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

#include <stdio.h>
int main() {
int a,b,max;
	while(scanf("%d%d",&a,&b))
	{
		max=a>b?a:b;
		//a和b中较大的那个数是
		printf(""max=%d\n",max);
	}
return 0;
}

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

#include <stdio.h>
int main(){
int i,j;
i=10;
j=1;
	if(i,j-1)//并不会进入f,逗号表达式整体的值是最后一个表达式的值
	{
		printf("If ecute\n");
	}
	//逗号表达式的常见使用场景,for 的表达式1初始化多个变量用的较多
	for(i=O,j=1;i<10;i++)
	{
	}
return 0;
}

2.自增自减运算符

自增、自减运算符和其他运算符有很大的区别,因为其他运算符除赋值运算符可以改变变量本身的值外,不会有这种效果.自增、自减就是对变量自身进行加1、减1操作,那么有了加法和减法运算符为什么还要发明这种运算符呢?原因是自增和自减来源于B语言,当时KenThompson和 Dennis M.Ritchie (C语言的发明者)为了不改变程序员的编写习惯,在C语言中保留了B语言中的自增和自减.因为自增、自减会改变变量的值,所以自增和自减不能用于常量!
下面是一段关于自增的程序。自增与取值运算符在408初试的时候不考,个别学校自命题可能会考
在这里插入图片描述
值得注意的是前置++与后置++,这两者虽然均是++,但是在实现的效果上截然不同,是因为两者底层实现原理不同。下面对二者进行了重载,可以看出重载后的效果与++i,i++一样。

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
class A{
    int n;
    public:
    A(int n):n(n){}
    int get();
    friend A& operator++(A &a);
    friend A operator++(A &a,int b);
};
A& operator++(A & a)
{
     a.n++;
     return  a;
}
A   operator++(A&a,int b)
{
    return   A(a.n++);
}
int A::get()
{
    return n;
}
int main()
{
     A a=5;
     (++(++a))++;
     cout<<a.get()<<endl;
     A b=a++;
     cout<<b.get()<<" "<<a.get()<<endl;
     system("pause");
     return 0;
}

3.位运算

位运算符<<、>>、~、I、^、&依次是左移、右移、按位取反、按位或、按位异或、按位与。

位运算符只能用于对整型数据进行操作:

  • 左移:高位丢弃,低位补0,相当于乘以2.工作中很多时候申请内存时会用左移,例如要申请1GB大小的空间,可以使用malloc(1<<30).
  • 右移:低位丢弃,正数的高位补О(无符号数我们认为是正数),负数的高位补1,相当于除以2.移位比乘法和除法的效率要高,负数右移,对偶数来说是除以2,但对奇数来说是先减1后除以2.例如,-8>>1,得到的是-4,但-7>>1得到的并不是-3而是-4.另外,对于-1来说,无论右移多少位,值永远为-1。
  • 异或:相同的数进行异或时,结果为0,任何数和О异或的结果是其本身。
  • 按位取反:数位上的数是1变为0,0变为1。
  • 按位与和按位或:用两个数的每一位进行与和或。

这里所提到的左移右移均指算术位移。还有一种逻辑位移,逻辑位移左移右移空缺的部位均补0。

#include <stdio.h>
//位运算符
int main() {
    short i = 5;//short是整型,是2个字节的整型,int 是4个字节
    short j;
    j=i << 1;//一个变量移动以后自身不会变化
    printf("j=%d\n", j);//左移是乘2,结果为10
//    i=-8;
    j = i >> 1;
    printf("j=%d\n", j);//右移是除2,结果是2
    printf("-----------------\n");
    i = 0x8011;
    unsigned short s = 0x8011;//在short前加unsigned
    unsigned short r = 0;
    j = i >> 1;//对i右移,对有符号数进行右移
    r = s >> 1;//对s右移,对无符号数进行右移
    printf("j=%d,r=%u\n", j, r);//结果是不一样的
    printf("-----------------\n");
    //接下来来看  按位与,按位或,按位异或,按位取反
    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;
}

异或运算符有两个特性,一是任何数和零异或得到的是自身,两个相等的数异或得到的是零,通过这两个特性,我们可以完成下面的题目,在一堆数中找出出现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=result^arr[i];//异或满足交换律
    }
    printf("%d\n", result);//输出为3
    return 0;
}

4.switch do-while补充

下面这两个作为了解(其实我感觉二级指针用的挺顺手,指针真是一个好东西!!!)
如果一个case语句后面没有break语句、那么程序会继续匹配下面的case常量表达式.
在这里插入图片描述

#include <stdio.h>
//switch 日期升级
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 31days\n",mon);break;
            case 4:
            case 6:
            case 9:
            case 11:printf("mon=%d is 30days\n",mon);break;
            default:
                printf("error mon\n");
        }
    }
    return 0;
}

在这里插入图片描述

#include <stdio.h>

int main() {
    int i=1,total=0;
    do{
        total+=i;
        i++;
    }while(i<=100);//必须有分号,否则编译不通
    printf("total=%d\n",total);
    return 0;
}

5.二维数组&二级指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.总结

到这里C语言涉及到的语法差不多也就结束了,虽然在大一大二的时候学习过几门编程语言,也写过一些代码,但是王道的C语言训练营还是坚持看了下来,自我感觉训练营讲解的C语言知识点没有那么全面,但是这也让我知道了408初试大概率会考哪些内容,我应该把重点放在哪里,应该把时间集中在哪里。后面还有4天就要结束督学营阶段的学习任务了,下一步就开始408的数据结构 冲!!!


在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1357733.html

相关文章

[Eigen中文文档] 深入了解 Eigen - 类层次结构

文档总目录 本文目录 原则Core 类基类继承图 英文原文(The class hierarchy) 本页面介绍了Eigen类层次结构中 Core 类的设计及其相互关系。一般用户可能不需要关注这些细节&#xff0c;但对于高级用户和Eigen开发人员可能会有用。 原则 Eigen的类层次结构的设计是为了避免虚…

深入浅出学好信号完整性概述总结专题

&#x1f3e1;《总目录》   &#x1f3e1;《宝典目录》 1&#xff0c;概述 本专题对信号完整性的本质&#xff0c;重要性&#xff0c;解决的问题&#xff0c;及解决方法等进行总结&#xff0c;帮助读者更加深入的理解信号完整性&#xff0c;并建立解决信号完整性问题的方向。…

ubuntu 20.04上安装更新的nodejs

How To Install Node.js on Ubuntu 20.04 | DigitalOcean ubuntu20上默认用apt install 安装的nodejs版本是 v10.几 官方提供了对应的脚本&#xff0c; 下面的setup_19.x 如果你需要v18&#xff0c;就把19改成18. # node 安装较新的版本 curl -sL https://deb.nodesource.co…

Java源码规则引擎:jvs-rules数据扩展及函数配置说明

jvs-rules数据拓展节点 数据拓展是数据可视化加工过程中的重要工具&#xff0c;它核心的作用是对原有数据表进行加工扩展&#xff0c;实现功能如下图所示 函数配置操作过程 操作说明 1、拖动数据拓展字段&#xff0c;并将字段拓展与之前的历史节点连接起来&#xff0c;点击数…

Redis底层封装细节

日常我们程序员在使用redis做缓存的时候&#xff0c;很少会直接使用到RedisTemplate直接操作k-v键值对&#xff0c;而是通过对RedisTemplate原生代码的封装&#xff0c;来构建我们日常便于使用习惯的代码来操作数据&#xff0c;这里我分享一下日常基本的对RedisTemplate底层的封…

【C++】STL反向迭代器模拟实现,迭代器适配器,迭代器类型简单介绍

反向迭代器 前言正式开始基本演示模拟实现的大致思路基本框架前置、--*重载->重载list和vector适配反向迭代器迭代器的类型库中reverse和sort模板参数中的迭代器reversesort 前言 本篇主要讲反向迭代器的模拟实现。 能够加深各位对泛型的理解。 前面我那篇string介绍里面…

将maven库中没有的jar包导入本地库后编译还提示缺这个jar包

Maven本地仓库有对应的jar包但是报找不到 问题原因 第一&#xff0c;你本地仓库对应的包文件夹下有_remote.repositories这个文件&#xff1b; 第二&#xff0c;你的项目现在连接不到下载这个包的仓库&#xff1b; 以上两点就是本地明明有对应的jar包&#xff0c;但项目中还…

Anaconda安装和激活

一、Anaconda下载地址 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD 说明&#xff1a;使用paddlepaddle需要先安装python环境&#xff0c;这里我们选择python集成环境Anaconda工具包 Anaconda是1个常用的python包管理程序安装完Anaconda后&#xff0c…