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

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的数据结构 冲!!!


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/apple_51931783/article/details/129268494