文章目录
- 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的数据结构 冲!!!