(操作符详解p2)C语言从入门到入土(入门篇)(二)

简介: 7. 关系操作符 8. 逻辑操作符 9. 条件操作符(三目操作符) 10. 逗号表达式 11. 下标引用、函数调用和结构成员 1. [ ] 下标引用操作符 2. ( ) 函数调用操作符 3. 访问一个结构的成员 12. 表达式求值 12.1 隐式类型转换 12.2 算术转换 12.3 操作符的属性

1. 下标引用、函数调用和结构成员


1. [ ] 下标引用操作符


操作数:一个数组名+ 一个索引值

int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。
 [ ]的两个操作数是arr和9。

90.png

2. ( ) 函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

#include <stdio.h>
 void test1()
 {
 printf("hehe\n");
 }
 void test2(const char *str)
 {
 printf("%s\n", str);
 }
 int main()
 {
 test1();            //实用()作为函数调用操作符。
 test2("hello bit.");//实用()作为函数调用操作符。
 return 0;
 }

91.png


指向的都是()的操作数。


3. 访问一个结构的成员

. 结构体 . 成员名

-> 结构体指针 -> 成员名


92.png93.png


94.png


12. 表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。

同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。


12.1 隐式类型转换

C 的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为 整型 提升 。


整型提升的意义 

表达式的整型运算要在 CPU 的相应运算器件内执行, CPU 内整型运算器 (ALU) 的操作数的字节长度

一般就是 int 的字节长度,同时也是 CPU 的通用寄存器的长度。

因此,即使两个 char 类型的相加,在 CPU 执行时实际上也要先转换为 CPU 内整型操作数的标准长

度。

通用 CPU ( general-purpose CPU )是难以直接实现两个 8 比特字节直接相加运算(虽然机器指令

中可能有这种字节相加指令)。所以,表达式中各种长度可能小于 int 长度的整型值,都必须先转

换为 int 或 unsigned int ,然后才能送入 CPU 去执行运算。

//实例1
char a,b,c;
...
a = b + c;

b 和 c 的值被提升为普通整型,然后再执行加法运算。

加法运算完成之后,结果将被截断,然后再存储于 a 中。


95.png96.png97.png98.png

上面c的补码补1是因为符号位为1如果是正数为0就补0,下面讲到了。


整体说(结合上下的图一起看):整型提升就是操作数里面有小于整型大小的类型如char(short)就会在计算时变成整型计算,然后截断为其类型的数,(这前面还不是整型提升哈),再然后到(如此题)a+b的时候(此时是8位),然后发生整型提升(因为是正数补了0),然后算出了:


99.png

但是c也是char只能存8个比特位

100.png101.png


如何进行整体提升呢?


整形提升是按照变量的数据类型的符号位来提升的

//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0
相关文章
|
7天前
|
存储 编译器 C语言
爱上C语言:操作符详解(下)
爱上C语言:操作符详解(下)
|
19天前
|
算法 测试技术 C语言
【C语言】异或(^)操作符
【C语言】异或(^)操作符
16 0
|
25天前
|
C语言
王桂林C语言从放弃到入门课程
课程目标16天,每天6节课,每节40分钟课堂实录,带你征服C语言,让所有学过和没有学过C语言的人,或是正准备学习C语言的人,找到学习C语言的不二法门。适用人群所有学过和没有学过C语言的人,或是正准备学习C语言的人!
25 2
王桂林C语言从放弃到入门课程
|
1月前
|
存储 算法 程序员
【c 语言 】位操作符详解
【c 语言 】位操作符详解
36 0
|
23天前
|
存储 编译器 程序员
C语言第十六弹---操作符(下)
C语言第十六弹---操作符(下)
|
1月前
|
存储 安全 编译器
【 c 语言 】赋值操作符详解
【 c 语言 】赋值操作符详解
53 0
|
1月前
|
存储 算法 编译器
【c 语言】算术操作符详解
【c 语言】算术操作符详解
41 0
|
8天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
16 0
|
19天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
23 0
|
19天前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
38 0