C语言中操作符总结(下)

  1. 逻辑操作符
    常见的逻辑操作符:
    逻辑与( && )、 逻辑或( || )
    逻辑操作运算中不看二进制位,只看真假。

    使用规则:
    逻辑与( && ):操作符作用的两个操作数全为 真 时结果为 “ 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。
在这里插入图片描述

  1. 条件操作符
    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;
}

在这里插入图片描述

  1. 逗号表达式
    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 的结果是多少?

在这里插入图片描述

  1. 下标引用操作符
    [ ]
    操作数:一个数组名 + 一个索引值
int arr[4] = { 5,3,4,1 };	// 这里的[ ] 不是下标引用操作符
arr[2] = 4;		// 这个 [ ] 才是下表引用操作符,arr 表示数组首元素地址
				// [ ] 的两个操作数是 arr 和 2
				// arr 表示数组首元素地址,[2]表示数组第三个元素
  1. 函数调用操作符
    ( )
    接受一个或多个操作数:第一个操作数是函数名,剩余的操作数都是传递给函数的参数。
#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;
}
  1. 结构体成员
    .结构体.成员名
    结构体对象访问自己的成员。
    在这里插入图片描述
    ->结构体指针 ->成员名
    结构体指针访问它指向对象的成员。
    在这里插入图片描述
### 关于C语言宏定义的操作符及其用法 #### 基本概念 在C语言中,`#define` 是一种预处理指令,用于创建宏定义。通过这种机制可以实现一些高级功能,例如字符串化(`#`)、标记粘贴(`##`)以及带参数的宏替换等。 --- #### 字符串化操作符 `#` 该操作符的作用是将宏参数转换为字符串字面量。具体来说,在宏展开过程中,任何传递给带有 `#` 的参数都会被转化为一个字符串形式。 以下是其基本语法示例: ```c #define PRINT(EXPR) printf(&quot;Expression: &quot; #EXPR &quot;\n&quot;) PRINT(a + b); // 展开后相当于:printf(&quot;Expression: a + b\n&quot;); ``` 上述例子展示了如何利用 `#` 将表达式转成字符串以便打印输出[^3]。 --- #### 标记粘贴操作符 `##` 此操作允许两个独立的部分拼接在一起形成一个新的标识符或者结构体成员名等合法成分。注意的是,仅当两侧都存在有效的内容时才能成功连接;否则会产生错误提示。 这里有一个简单的实例来说明它的作用: ```c #define CONCAT(x, y) x##y int main() { int value1 = 10; CONCAT(value, 1)++; // 这里会展开成为value1++ return 0; } ``` 在这个片段里面,我们看到通过使用 `##` 把分开写的两部分合成了单一变量名称。 --- #### 参数化的宏定义 `(parameters,...)` 除了简单替换成固定文本外,还可以定义接受输入参数的函数样式的宏。这些参数可以在替换列内部按照需求灵活运用。 下面给出了一种常见模式的例子: ```c #define MAX(a,b) ((a)&gt;(b)?(a):(b)) int result = MAX(5,7); // 经过预处理器之后变为如下代码行: // int result = ((5)&gt;(7)?(5):(7)); ``` 这段代码清楚地明了如何借助这样的方式构建简洁实用的小型逻辑单元[^4]。 --- #### 条件编译与未定义检测 `#ifndef`, `#ifdef`, `#if` 这部分属于更广泛的预处理范畴而非严格意义上的&ldquo;操作符&rdquo;,但它同样基于宏的概念工作。它们用来判断某个特定符号是否存在当前环境中从而决定是否执行某些区块内的声明或语句。 典型的应用场景如跨平台兼容性调整或是启用/禁用特殊特性等功能开关设置。 ```c #ifndef DEBUG_MODE #define RELEASE_VERSION #else #undef RELEASE_VERSION #endif ``` 在此处可以看到根据先前可能存在的DEBUG_MODE状态动态切换其他关联标志的状态[^2]。 --- ### 总结 综上所述,C语言提供了丰富的工具集支持开发者高效完成各种任务自动化过程的同时保持源码清晰易读。掌握好以上提到的技术要点对于提升编程效率大有裨益。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值