返回

表达式与运算符(5)

发布时间:2022-11-26 13:09:55 1364
# 数据

一、基本概念

表达式:运算符、变量、常量的组合,且表达式可以求值。

运算符:对各种变量和常量进行运算的符号。

圆括号 () :括号内表达式被优先计算。

:对任意的表达式加(),不改变()内表达式的值,仅改变复合表达式中计算顺序。

二、初等表达式

初等表达式的3种情况:1)变量或函数标识符 2)常量 3)字符串字面值

例如:int y=x+5;

其中,x:变量标识符,是初等表达式,值为变量x当前的值;

10:整数常量,也是表达式,值为10;

:"abcd" 字符串也是初等表达式,值为指向char类型的指针;括号表达式:不改变表达式的值

三、后缀表达式

>>数组下标[]

>> 函数调用()

>>结构或联合直接成员选择.

>> 结构和联合间接成员选择->

>> 后缀自增++

>> 后缀自减--

>>前缀自增++

>>前缀自减--

>>地址运算&

>>正号运算+

>>负号运算-

>>按位取反~

>>逻辑非运算!

>>类型或数据对象的大小sizeof


示例:

int sum(int a, int b) {
return a+b;
}
int value = sum(1,2); // sum(1,2)是函数调用表达式,值为3

struct Student {
char *name;
int age;
} student;//结构体
int age = student.age // 直接访问成员age的值
char *name = sutdent->name // 间接访问指针成员name的值

int x,y;
x = 10;
y = x++; // 等价于 y=x; x=x+1; 此时y=10,x=11
y = x--; // 等价于 y=x; x=x--; 此时y=10,x=9
y = ++x; // 相当于 x=x+1; y=x 此时y=11,x=11
y = --x; // 相当于 x=x--; y=x 此时y=9,x=9
y = ~x; // 10转为32位二进制表示 00000000 00000000 00000000 00001010
// 按位取反变成11111111 11111111 11111111 11110101,因此y=-11
y = !x; // 0表示假,非0表示逻辑真,x非零为真,取非后为假,y=0
size = sizeof(x);// 对变量x求长度,x为int型,值为4个字节,size的值为4
int size = sizeof(int);// 对整型int求长度,一般为4个字节,size的值为4

int i = 10;//普通变量
int *p = &i;// &获取变量i的地址赋值为指针p,*p可以间接访问i的值
int v = *p;// 变量v的值为10

四、强制类型转换

:强制转换类型,会导致数值精度损失。

(float)3.1415926    // double类型转换为float
(int)3.1415926f // float类型转换为int

五、二元表达式

1)乘除求余表达式:乘法* 、除法/ 、求余%

注:乘除支持所有整数和小数类型,

求余运算只支持整数。

除法和求余的除数不能是0。

2)加减表达式:加法+ 、减法-

3)移位表达式:左移<< 、右移>>

4)关系表达式:小于< 、小于等于<= 、大于> 、大于等于>=

5)判等表达式:等于== 、不等于!=

6)按位与表达式:&

7)按位异或表达式:^

8)按位或表达式:|

9)逻辑与表达式:&&

​​a&&b,如果变量或表达式a的值为0,则表达式结果0,不需要对变量或表达式b进行计算。

10)逻辑或表达式:||

​a||b​​,如果变量或表达式a的值为1,则表达式结果1,不需要对变量或表达式b进行计算。

11)真值表如下:1表示真,0表示假

示例:

int x=2,y=9;
x*y = 18
y/2 = 4 // 整数运算,默认是值是int型,取整
y/2.0 = 4.5 // 整数运算,默认是值是int型,取整
注:5/2=2、5%2=1、5/2.0=2.5、5.0/2=2.5、5.0/2.0=2.5

x << 2 // x的值按位向左移动2位,空出的二进制填充0,x = 8
x >> 2 // x按位向右移动2位,空出的二进制填充0,x = 0

x > y // 结果为假,值0
x >= y // 结果为假,值0
x < y // 结果为真,值1
x <= y // 结果为真,值1
x == y // 结果为假,值0
x != y // 结果为真,值1

x & y // x二进制表示 0010,y二进制表示 1001,按位与结果是 0000
x ^ y // 结果1111
x | y // 结果1011

1 && 0 值 0
1 && 1 值 1
1 || 0 值 1
0 || 0 值 0

六、三元表达式

条件运算符 ?:

语法: 表达式?表达式1:表达式2   //当表达式结果为真(非0)时,返回表达式1的值,否则返回表达式2的值。

int x,y;
int max=x>y?x:y // 若x>y返回x,否则返回y的值

七、赋值表达式

1)乘除求余复合赋值: *=、 /=、 %=

2)加减复合赋值: +=、 -=

3)位移复合赋值: 左移<<= 、右移>>=

4)位运算复合赋值: 与&= 、异或^= 、|=或

x *= y  // x=x*y
x /= y // x=x/y
x %= y // x=x%y
x += y // x=x+y
x -= y // x=x-y

x <<= 2 // x=x<<2
x >>= 2 // x=x>>2
x &= y // x=x&y
x ^= y // x=x^y
x |= y // x=x|y

八、逗号表达式

多个表达式用逗号分割,从左到右按顺序计算。逗号表达式运算的结果是最后一个表达式的值。

int value=x1,x2;//结果是最后一个表达式x2的值。

九、常量表达式

1)预处理器常量表达式:预处理指令中使用的整数常量表达式

2)整数常量表达式:整数常量、枚举常量、字符常量、sizeof表达式、浮点常数强制转换

3)初始化常量表达式:算术常量表达式、空指针常量NULL、地址常量表达式

4)地址常量:指向静态存储期对象的指针和指向函数指示符指针,可以通过​​&​​地址算符显式创建的地址常量,也可以创建数组或函数类型 的表达式隐式创建。

注:常量表达式的值在编译时就可以由编译器直接计算得出,不需要程序执行时计算。

常量表达式不应包含赋值、增量、减量、函数调用或逗号运算符。

×:sizeof运算符操作数可以出现上述情况,sizeof只需要根据类型推断大小,不需要对操作数求值。

参考资料:公众号: 一只爱学C的喵 C语言学习笔记

------------END------------



特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
C++的简单int赋值 2022-11-26 12:42:13