C语言学习-5

C语言学习系列文章目录


一、操作符

~//取反操作
如下对整数a=0进行取反的操作
~a 
0的原码是:00000000000000000000000000000000
进行取反操作后就变成了:11111111111111111111111111111111
然后储存在系统里
(注意全1就是补码了,也就是说取反是对原码取反,结果是当成补码用)
然后打印出来全1的话,就是-1(补码全1

整数的储存方式有三种:原码、反码、补码
这个三种码是数字逻辑电路里面会学习的内容;
整数在内存里储存的是补码

-1为例:
原码:10000000000000000000000000000001  //就是二进制的-1,首位是符号位,然后后面就是1的二进制表达形式
反码:11111111111111111111111111111110  //就是将-1的原码除了符号位,剩余的全部取反
补码:11111111111111111111111111111111  //就是将反码再+1之后

正整数来说原码、反码、补码相同哦!

对于++的表达式

++a和a++是两个东西哦
{
int a = 10;
int b = ++a;
结果是
b=11
a=11
}
{
int a = 10;
int b = a++;
结果是
b=10
a=11
}
如上所述,a++是先使用再+1。也就是说b=a++是先b=a,然后再让a++;
而对于++a来说,是先让a+1,然后再让b=a;
当然实际中是不建议使用++这个符号的其实,特别是一堆++a和a++的东西本质上意义不是很大的,但是通常for循环是会用i++的;

对于强制类型转换()这个模式

通常int a = 3.14;这个式子是错误的;
但是可以通过 int a = (int)3.14;这样就是可以,就不会报错了;

逻辑操作符&&、||逻辑与和逻辑或

int a = 3;
int b = 5;
int c = a && b;  //此时c=1,因为ab都为真;如果a=0或者b=0的话,那么c=0;
int d = a || b;  //此时d=1,因为ab都为1;如果a=0并且同时b=0,那么d=0;只要任意ab不均=0的情况,都有d=1;

条件操作符(三目操作符):exp1?exp2:exp3注意expn是表达式的意思

exp1成立的情况下,进行exp2的计算,整个表达式的结果就是exp2的结果;
exp1不成立的情况下,进行exp3的计算,整个表达式就是exp3的结果;
也就是先判断exp1再做exp2或exp3的计算;
简单的if结构可以用exp来代替;
如下代码可以被代替:
if(a>b)
	c=0;
else
	c=1;
如上的代码可以被写成如下的形式:
c = a > b ? 0 : 1;

逗号表达式:exp1,exp2,exp3,exp4……从左向右表达式的计算,并且输出是最后一个expn的结果

(2,3,4+5,6);这个表达是成立的,但是没有意义
int a = 0;
int b = 1;
int c = 2;
int d = (a = a + 1,b++, c =  a + b)//d的取值就是最后一个表达式的结果
//d的结果是这样来的,首先a=1;然后b=2然后c=1+2=3,因此d=3;

下标引用、函数调用和函数成员
下标引用操作符就是[]
函数调用操作符就是()

int a[3]={1,2,3};
a[1];//[]就是下标引用操作符了
printf("%d\n",arr[0]);//()就是函数调用操作符了,这里只有传2个参数
printf("hehe\n");//这里传输1个参数

二、常见关键字

c语言提供的关键字是c语言自带提供的,不能自己创建的。关键字也不能作为变量名。
通常局部变量都用auto开头也就是auto int a = 5;这样的形式,不过一般都省略了;

auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct typedef union unsigned void volatile while

auto 是自动的,每个局部变量都是auto修饰的;
extern 是用来申明外部符号的;
register 是建议修饰的变量和值存放在寄存器中,具体是否存在寄存器中要看编译器是否存放;
signed 有符号的 10、-20之类的
unsigned 无符号的
static 静态的、可以修饰局部变量、全局变量、函数
struct 结构体
union 联合体/共同体
void void可以用来写函数无需返回值;空的意思
volatile
typedef 类型重命名

define 不是关键字!是预处理指令
include 不是关键字!是预处理指令

typedef的使用示例

typedef unsigned int u_int;//重新定义 unsigned int 变为u_int的模式;
int main()
{
unsigned int a = 10;//和下一行的代码意思相同哦!
u_int a = 10;
return 0
}

static的使用示例

static修饰局部变量,能够改变变量的存储类型,从而改变局部变量的生命周期,不会因为局部的结束而被销毁。

static的局部变量使用

void test()
{
 	static int a = 1;//a没有被销毁,所以++后会显示 2、3、4、5、6、7、8、9、10
 	a++;
 	printf("%d",a);
}
int main()
{
	int i = 0;
	while(i<10)
	{	
		test();
		i++;
	}
	return 0;
}

static的全局变量的使用

static修饰源文件中的全局变量后,其他的源文件将不能够使用了,将被限制仅限自己的源文件使用,但是其他的全局变量可以通过extern来被调用;也就是static修饰后全局变量将具有内部链接属性,而全局变量具有外部连接属性;

static int a = 0;//只能自己用
int a = 0;		 //可被其他文件调用
extern int a = 0;//调用其他文件的int a

static修饰函数的使用

static修饰的函数也将会限制他的外部链接属性,从而使函数具有内部链接属性,无法被extern调用

//在一个文件中声明一个函数
static int add()	{};//仅在自己当前这个源文件中使用
int Adds(int x,int y){};
extern int Adds(int x,int y);
int main()
{
	Adds(x,y);
}

计算机中的数据可以存储的地方

寄存器    //更小
高速缓存  //几十MB
内存	 //8-16G	
硬盘	 
网盘
栈区  	——局部变量
堆区  	——动态内存分配
静态区	——全局变量和static修饰的静态变量

三、预处理指令

define定义符号

#define max 1000
int main()
{
	int a=max;//a=1000	
}

define 定义宏

#define ADD(X,Y) X+Y
int main()
{
	int a=ADD(2,3);//a=5=2+3
	int b=4*ADD(2,3);//b=11=4*2+3

也就是说define的定义宏是直接替换而不是优先计算,所以这里会存在b≠20,当然也可以用括号来增加优先级


总结

今天学习的内容主要宏定义、操作符和一些关键字的内容,上手快,后面要进行指针了,有点难~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值