c语言基础6

1.逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。

我们来看下面的一个代码:

int main()
{
	int a = 1;
	int b = 2;
	int ret = (a > b, a = b + 2, b, b = a + 1);
	printf("%d", ret);
	return 0;
}

按照上面的规则应该为5,那么到底是不是呢?我们来看看。

 在逗号表达式中最后一个表达式的结果为整个表达式的结果,但是前面的表达式可能会影响最后一个表达式的值。

2.结构体

1.结构体的声明

在这里struct是关键词,假如我们需要描述一个学生的名字和年龄。

struct Stu
{
char name[20]; //名字
int age; //年龄
};

注意:在这里的Stu是结构体的名字不是变量。

2.结构体的初始化
struct Stu
{
	char name[20]; //名字
	int age; //年龄
};
int main()
{
	struct Stu s1 = { "zhang",18 };
	struct Stu s2= { "lisi",23 };
	return 0;
}
3. 结构成员访问操作符(.)

我们要如何打印结构体呢?我们就要使用结构成员访问操作符(.)来进行访问成员。

演示如下:

struct Stu
{
	char name[20]; //名字
	int age; //年龄
};
int main()
{
	struct Stu s1 = { "zhang",18 };
	struct Stu s2= { "lisi",23 };
	printf("%s %d", s1.name, s1.age);
	return 0;
}

结果如下:

3. 操作符的属性:优先级、结合性

在数学计算中我们知道先算乘除后算加减,那么在c语言中有没有相似的规则呢?

其实C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。下面我们来看一个例子:

int main()
{
	int b = 1 + 2 * 3;
	printf("%d",b);
	return 0;
}

这个结果大家应该都会知道为7,这里就是典型的优先级表现,*的优先级比+的优先级高,所以先算*后算+

运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从高到低排列),建议大概
记住这些操作符的优先级就行,其他操作符在使用的时候查看下面表格就可以了。
• 圆括号( () )
• 自增运算符( ++ ),自减运算符( -- )
• 单目运算符( + 和 - )
• 乘法( * ),除法( / )
• 加法( + ),减法( - )
• 关系运算符( < 、 > 等)
• 赋值运算符( = )
由于圆括号的优先级最⾼,可以使用它改变其他运算符的优先级。


操作符优先级详解icon-default.png?t=N7T8https://zh.cppreference.com/w/c/language/operator_precedence

4.整型提升

C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

1.整型提升的意义

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度⼀般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsignedint,然后才能送入CPU去执行运算。

2.整型提升的规则

1. 有符号整数提升是按照变量的数据类型的符号位来提升的
2. 无符号整数提升,高位补0

我们来看一串代码:

int main()
{
	char a = -2;
	char b = 10;
	printf("%d", a + b);
	return 0;
}

在这串代码中可以看到创建了两个char类型的变量,并且都进行赋值,但值得思索的是我们给char类型赋值int 类型的时候是怎么放进去的,其实存放到a中时发生了截断,也就是说一开始-2的补码有32为bit但是只存进去了8位,这8位是后面的8位,也就是11111110 ,但是在计算过程中又要进行整型提升,也就意味着它们在计算时又通过整型提升变成32bit位进行计算。

5.问题表达式

我们来看一串代码:

int main()
{
int i = 10;
i = i-- - --i * ( i = -3 ) * i++ + ++i;
printf("i = %d\n", i);
return 0;
}

当出现这样的代码时,给人的感觉就是很难读懂,可读性差,由于优先级的不确定这个代码在不同编译器上的结果可能不同。

再来看一串代码:

#include <sdtio.h>
int fun()
{
static int count = 1;
return ++count;
}
int main()
{
int answer;
answer = fun() - fun() * fun();
printf( "%d\n", answer); //输出多少?
return 0;
}

这个代码其实也是有问题的,因为我们不知道函数调用的顺序是从哪一个fun开始的。所以也存在不同编译器,结果不同的现象。

谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c23856

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值