今天是自学的第三天,主要学了操作符,常见关键字等,同样是先大概了解,以后在进行仔细学习,以下是今天的学习成果。
目录
操作符
算数操作符
算数操作符 : + - * / %
/:取商 %:取模
由上述代码可以明显的看出'/','%' 分别是取商和取余。
移位操作符
移(二进制)位操作符 :>>(右移) <<(左移)
我们知道,整型1占4个字节,也就是32个bit,即0000 0000 0000 0000 0000 0000 0000 0001,当a左移2时,变为:0000 0000 0000 0000 0000 0000 0000 0100,转换成十进制为2^2=4,所以打印出b的值为4。右移同左移一样。
位操作符
(二进制)位操作符:&(按位与) |(按位或) ^(按位异或)
4的二进制数为100,5的二进制数为101
按位与:对应的二进制位只有都为1,才为1。100&101结果为100,100的二进制数为4,即打印出的b是4。
按位或:对应的二进制位只要有一个为1,就为1。100|101结果为101,101的二进制数为5,即打印出的b是5。
按位异或:对应的二进制位相同为0,不同为1。100^101结果为001,001的二进制数为1,即打印出的b是1。
赋值操作符
赋值操作符: = += -= *= /= &= ^= |= >>= <<=
'='为把右边的值赋给左边。
比如说:a = a + 1;就等于a += 1;上边同理。
单目操作符
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符 |
(类型) | 强制类型转换 |
#include <stdio.h>
#include <string.h>
int main()
{
int a = 10;
int arr[] = {1,2,3,4,5,6};//6*4=24
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof(int));//4
printf("%d\n",sizeof a);//4
//可以看出sizeof不是一个函数 是一个操作符
//printf("%d\n",sizeof int);//会出错误,不能这么写
printf("%d\n",sizeof(arr));//24 计算数组大小,单位是字节
printf("%d\n",sizeof(arr)/sizeof(arr[0]));//6
return 0;
}
sizeof 以前也提到过,就是计算类型的长度,整型占4个字节,所以sizeof(a)打印出来为4,可以把a那个括号省略掉,可以看出sizeof不是一个函数,而是一个操作符。
我们主要看一下++和--
#include <stdio.h>
int main()
{
int a = 1;
int b = a++;//后置++,先使用再++
int c = ++a;//前置++,先++再使用
printf("a = %d b = %d c = %d\n",a,b);//a = 3 b = 1 c = 2
int d = 6;
int e = d--;//后置--,先使用在--
printf("d = %d e = %d\n",d,e);//d = 5 e = 6
int f = 4;
int g = --f;//前置--,先--再使用
printf("f = %d g = %d\n",f,g);//f = 3 g = 3
return 0;
}
a++ 后置++,先使用再++
也就是b先被赋值为a原本的值,然后a再进行++,所以打印出来a = 2 , b = 1
++a 前置++,先++再使用
也就是a先++变为2,然后再把2赋值给c,所以打印出来a = 3 , c = 2
d-- 后置--,先使用再--
也就是e先被赋值为d原本的值,然后d再进行--,所以打印出来d = 5 , e = 6
--f 前置--,先--再使用
也就是f先--变为3,然后再把3赋值给g,所以打印出来f = 3 , g = 3
以上就是++和--的简单的代码描述。
exp1 ? exp2 : exp3
exp1 ? exp2 : exp3 当exp1语句为真时,执行exp2,为假时,执行exp3
让我们举个例子,判断两个数的大小,输出最大的数
#include <stdio.h>
int main()
{
int a , b , max;
printf("请输入a:");
scanf("%d",&a);
printf("请输入b:");
scanf("%d",&b);
max = (a>b ? a : b);
//exp1 ? exp2 : exp3 当exp1语句为真时,执行exp2,为假时,执行exp3
if (a>b)
{
printf("max:%d\n",max);
}
else
{
printf("max:%d\n",max);
}
return 0;
}
这就是一个简单的例子,可以让我们直观的看出来 exp1 ? exp2 : exp3 语句的使用方法。
static关键字
static关键字修饰局部变量
修饰局部变量,使局部变量的生命周期变长
static修饰全局变量
改变了变量的作用域,让静态的全局变量只能在自己的源文件里边使用,出了源文件就不能在使用了。
我们在同一个项目中又创建了一个源文件,在里边定义一个变量,这是全局变量,我们在另一个源文件里边用extern来声明这个变量,再编译运行,发现能运行成功,我们能够使用这个全局变量。
当我们在这个全局变量的前边加上一个static,这是一个静态局部变量,这时候当我们再次运行时我们发现出现了错误,这说明变量的作用域被改变了,除了自己的源文件,其他都不能使用这个全局变量。
static修饰函数
static 修饰函数就是改变了函数的链接属性,从外部链接变成了内部链接。
我们同样可以用extern来调用这个函数,当我们加上static时,还能调用吗?让我们来试一下。
同样是出现错误,不能被编译运行,static改变了函数的链接属性,从外部链接变成了内部链接。
这就是我今天学习的内容,有错误请指正,感谢大家,希望每个人都越来越好!