- 逻辑操作符
常见的逻辑操作符:
逻辑与( && )、 逻辑或( || )
逻辑操作运算中不看二进制位,只看真假。
使用规则:
逻辑与( && ):操作符作用的两个操作数全为 真 时结果为 “ 1 ” ,其他情况结果都为 “ 0 ”。
逻辑或( || ):操作符作用的两个操作数全为 假 时结果为 “ 0 ”,其他情况结果都为 “ 1 ”。
在实际生活中的应用:判断闰年等。
// 输出1000-2000 年之间的闰年
#include<stdio.h>
int main()
{
int count = 0;
int year = 0;
for (year = 1000; year <= 2000; year++) {
// 判断闰年条件(能被 4 整除但不能被 100 整除,或者能被 400 整除)
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
printf("%d ", year); // 输出闰年
count++; // 计数
}
}
printf("\ncount = %d\n", count); // 输出1000-2000 年之间的闰年个数
system("pause");
return 0;
}
特别注意1: 逻辑与 和 按位与,逻辑或 和 按位或 的区别。
如:
特别注意2: 逻辑与 和 逻辑或 的特点
//逻辑与
#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\n d = %d\n", a, b, c, d);
system("pause");
return 0;
}
// 程序输出的结果是什么?
首先来分析一下这段代码:这里的i = a++ && ++b && d++;
是用两个“ && ”连接,逻辑与的特点就是它的两个操作数都为 真 时结果才为真,所以代码在执行时先判断 a 是否为真,如果为真,执行 ++b,然后判断 b 自增后的结果是否为真,若为真则执行a++ && ++b
,如果a++ && ++b
结果为真,继续向后执行;否则代码只执行到判断为假的那步,之后的代码一律不执行。
这里由于 a 的初值等于 0,为假,所以代码执行到这里就不再继续向后执行,最终结果为:a = 0 , b = 2 , c = 3 , d = 4。
//逻辑或
#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\n d = %d\n", a, b, c, d);
system("pause");
return 0;
}
// 程序输出的结果是什么?
首先来分析一下这段代码:这里的i = a++ && ++b && d++;
是用两个“ || ”连接,逻辑或的特点就是它的两个操作数都为 假 时结果才为假,所以代码在执行在执行的过程中无论“ || ”的两个操作数是否为真都会一直执行,直到最后一个代码之前的代码全部执行完才会判断,如果前边所有代码的执行结果为真,那么最后一个代码就不再执行,否则执行最后一个代码。
这里在执行i = a++ || ++b || d++;
时,先执行a++ || ++b
由于 b 的初值为 2,所以 ++b 的结果为真,即:a++ || ++b
的结果为真,所以 d++
就不再执行。最终结果为:a = 1 , b = 3 , c = 3 , d = 4。
- 条件操作符
exp1 ? exp2 : exp3
运算规则:
如果 exp1 为真,则结果为 exp2 ,否则结果为 exp3。
如:
#include<stdio.h>
int main()
{
int a = 10;
int b = 0;
if (a > 5) {
b = 3;
}
else{
b = -3;
}
printf("b = %d\n", b);
system("pause");
return 0;
}
将上面代码转换为条件表达式:
#include<stdio.h>
int main()
{
int a = 10;
int b = 0;
(a > 5) ? (b = 3) : (b = -3);
printf("b = %d\n", b);
system("pause");
return 0;
}
例:使用条件表达式实现找两个数中的较大值。
#include<stdio.h>
int main()
{
int a = 3;
int b = 9;
int max = 0;
max = (a > b) ? a : b;
printf("max = %d\n", max);
system("pause");
return 0;
}
- 逗号表达式
exp1, exp2, exp3, … expN
逗号表达式就是用逗号隔开的多个表达式。
运算规则:
逗号表达式,从左向右依次执行,整个表达式的结果是 最后一个表达式 的结果。
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1); // 逗号表达式
printf("c = %d\n", c);
system("pause");
return 0;
}
// c 的结果是多少?
- 下标引用操作符
[ ]
操作数:一个数组名 + 一个索引值
int arr[4] = { 5,3,4,1 }; // 这里的[ ] 不是下标引用操作符
arr[2] = 4; // 这个 [ ] 才是下表引用操作符,arr 表示数组首元素地址
// [ ] 的两个操作数是 arr 和 2
// arr 表示数组首元素地址,[2]表示数组第三个元素
- 函数调用操作符
( )
接受一个或多个操作数:第一个操作数是函数名,剩余的操作数都是传递给函数的参数。
#include<stdio.h>
//定义函数
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 5;
Add(a, b); // 调用函数,这里的()就是函数引用操作符
// 接收了三个操作数:Add、a、b
system("pause");
return 0;
}
- 结构体成员
.结构体.成员名
结构体对象访问自己的成员。
->结构体指针 ->成员名
结构体指针访问它指向对象的成员。