C语言——操作符详解(下)
- 一、赋值操作符
- 二、复合赋值符
- 三、单目操作符
- 单目操作符介绍
- 四、 关系操作符
- 五、逻辑操作符
- 六、条件操作符
- 七、逗号表达式
- 八、下标引用、函数调用和结构成员
- 8.1 [ ] 下标引用操作符
- 8.2 ( ) 函数调用操作符
- 8.3访问一个结构的成员
一、赋值操作符
可以让你对于前不满意的值。也就是你可以给自己重新赋值。
int a=20;
a=10;
int weight = 120;//体重
weight = 89;//不满意就赋值
二、复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^
这些复合赋值符可以写成复合的效果,例子如下:
int a=10;
a=a+10;
a+=10;
三、单目操作符
单目操作符介绍
符号 | 含义 |
---|---|
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
– | 前置、后置– |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
四、 关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
五、逻辑操作符
&& 逻辑与
|| 逻辑或
eg:应该注意逻辑操作符与按位操作符的区别
例1:
int main()
{
int a = 3;
int b = 2;
printf("%d\n", a & b);
printf("%d\n", a && b);
return 0;
}
编译结果:
例2:
int main()
{
int a = 3;
int b = 2;
printf("%d\n", a | b);
printf("%d\n", a || b);
return 0;
}
编译结果:
一道面试题:
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
编译结果:
这是因为a的初始值为0,而++在后,a所以为先用后加,而逻辑操作符看到a为0后,便不执行之后的代码,所以b,c,d的值并没有发生改变。所以输出结果为上述表达式。
变式1:改变a的初始值为1;
#include <stdio.h>
int main()
{
int i = 0,a=1,b=2,c =3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
编译结果:
当a的结果为1时,逻辑操作符看到a为真时,需要验证其他的表达式是否为真,所以会执行之后的代码,所以输出结果为上述表达式。
变式2:
#include <stdio.h>
int main()
{
int i = 0,a=1,b=2,c =3,d=4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
编译结果:
当a的初始值为1时,逻辑或只要有一个为真,其结果就为真,所以不会执行其他的代码,所以输出结果为上述表达式。
变式3:
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
编译结果:
当a的初始值为0时,代码往后执行,执行到 ++b 时,式子结果为真,便不往后执行代码,所以输出结果为上述表达式。
六、条件操作符
exp1 ? exp2 : exp3
可以使用条件表达式实现找两个数中较大值。
如:
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > b)
printf("%d\n", a);
else
printf("%d\n",b);
printf("%d", (a > b) ? a : b);
return 0;
}
七、逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
例如:
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d", c);
return 0;
}
编译结果:
八、下标引用、函数调用和结构成员
8.1 [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int main()
{
int arr[5] = { 0,1,2,3,4 };
printf("%d ", arr[2]);
return 0;
}
编译结果:
8.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;
}
编译结果:
8.3访问一个结构的成员
struct Book
{
char name[20];
char author[30];
int price;
};
int main()
{
struct Book b1 = {"C语言", "小李", 66};
struct Book b2 = { "C++", "小王", 88 };
printf("《%s》 %s %d\n", b1.name, b1.author, b1.price);
printf("《%s》 %s %d\n", b2.name, b2.author, b2.price);
//结构体变量.成员名
return 0;
}
编译结果: