c语言操作符详解

c语言操作符有以下几大类:
1.算术操作符
2.关系操作符
3.逻辑操作符
4.位操作符
5.赋值操作符
6.单目运算符
7.逗号运算符
8.条件运算符
9.下标访问,函数调用,结构体成员访问操作符

一.算术操作符(+ - * / %)

常见运算符就是 加 减 乘 除 取模 取余(取模),加减很简单了,和数学中的使用没什么区别。这里的重点主要在 / 和 % 操作符了,这两个操作符涉及到很多c语言类型的问题。下来给大家介绍一下:
**

1. / 除法操作符:

该操作符在运算结果为整型数据的运算上似乎没什么问题,但很多初学者在计算浮点数时总是达不到自己预期的结果,因为使用 / 运算符想得到浮点数数据时必须满足操作数为浮点数,然后操作结果保存在浮点数类型的变量中。举例:

int main()
{
	double ret = 0.0;//用浮点数来保存操作结果
	ret = 1.0 / 2.0;//操作数为浮点数
	printf("%f\n", ret);//打印时以%f的格式打印
	return 0;
}

其中第四行代码,ret = 1.0 / 2.0;平时很多人会写成ret=1.0/2; 结果同样正确,上面不是说操作数必须是浮点数吗,这里2是整型啊,原因在于此处编译器进行了隐式类型转换,将 2 转换为double类型,这样 / 两边的操作数都是浮点型了。这个大家要心里清楚。(隐式类型转换和强制类型转换及数据截断,整形提升会在博主的另一篇博客中讲到);
另外需要注意的是 / 右边的除数不能为0,否则编译器会报错。
**

2.% 取余操作符

该操作符对处理的数据类型比 / 还要严格,它操作的数据必须是整型且不能对0取模;可以应用于取数位或者通过随机数产生一个内的范围数;
举例:

int main()
{
	int ret = rand() % 100;//产生0-99的随机数
	//ret = 10 % 0;编译器报错!
	printf("%d\n", ret);
	return 0;
}

二.关系操作符(< > <= >= == !=)

关系操作符均为双目运算符,其运算结果只有两种结果,即真(1)或者假(0)。这里注意不能用数学的思维来用这些操作符,一些容易犯的错误,如判断一个变量a是否在一定范围内。就不能写成10<a<20;这里编译器会先执行10<a;上面说过该表达式的值只有0和1,那么无论10和a的大小关系如何,10<a;的运算结果一定是小于20的`,这与我们的预期不符!因此应该写成10<a&&a<20;这两个表达式运算结果完全不同。

int main()
{
	int a = 30;
	if (10 < a < 20)
	{
		printf("我是bug!\n");
	}
	else
	{
		printf("我才是bug\n");
	}
	return 0;
}

运行结果:
在这里插入图片描述
还有需要注意的一点就是 == 和 = 易出现手误写错,造成不容易发现的bug!

三.逻辑操作符(|| && ! )

首先区别于逻辑与和逻辑或操作符&& 和 ||,明确这是两种操作符!这几种操作符在使用中有一些规律,&&运算符中有一个为假,结果一定为假,且前面表达式为假时不再执行后面的表达式; 而||运算符结果有一个为真,其结果一定为真,且当前面条件为真时,后面的条件就不再执行和判断真假。举例:

int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	//i = a++ && ++b &&++c&& d++;//输出结果为a=1 b= 2 c=3 d=4
	i = a++||++b||++c||d++;//输出结果为: a=1 b=3 c=3 d=4
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	return 0;
}

这道例题就可以是我们充分理解这两种操作符。
还有一个逻辑取反操作符!,这个很好理解了,就是给一个表达式逻辑取反。

四.位操作符 ( ^ | & ~ >> << )

  • 移位操作符:>> <<
    移位操作符有左移和右移操作符,这里在移位时可有点东西了。
    当使用左移运算符时,很简单,将数的二进制数向左移,左移多少位就在右边补多少位的0。
    当使用右移运算符时,右移运算有两种方式:
    逻辑右移:逻辑右移在右移后在左边补0
    算术右移:算术右移在右移后在左边补符号位
    注意:移位运算符不能移动负数位。例如:n=n<<-1;这样是不允许的!
  • 位运算操作符:^ | &
    按位与和按位或很简单喽,和数字电路中的一样,两位相与一位为0,则该位的结果为0;
    两位相或有一位为1,则该位结果为1。通常使用&1操作来获取一个二进制数的每一位。
    举例:
int main()
{
	int num = 10;
	for (int i = 31; i >=0; i--)
	{
		printf("%d", (num>>i)& 1);//正序打印num的二进制数
	}
	printf("\n");
	return 0;
}

除此之外还有异或操作符,该操作符有个特性就是一个数将另一个数异或两次之后得到的数还是原来的数。即就是异或同一个数两次相当于没异或。
举例:
题目描述:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)

int find_num(int *p,int size)
{
	int ret = 0;//0异或任何数等于任何数
	for (int i = 0; i < size; i++)
	{
		ret=ret ^ *(p + i);
	}
	return ret;
}
int main()
{
	int arr[] = { 4, 5, 8, 9, 5, 8, 4 };
	int n = sizeof(arr) / sizeof(arr[0]);
	int num=find_num(arr, n);
	printf("%d\n", num);
	return 0;
}

五.赋值操作符(= += -= /= %= *= |= &= >>= <<=)

  • 简单赋值 =
    这个操作符很简单,就是用于给数据赋值,但很多初学者容易使用该赋值操作符给字符串赋值,这里注意不能使用该操作符给字符串赋值!
  • 复合赋值 += -= *= /= %= |= &= >>= <<=
    这些操作符均都是将操作符左边的数和右边的数进行运算后再赋值给左边的数。这样能够使代码看起来更简洁!

六.单目运算符(++ – sizeof * & ~ ! (类型) - +)

  • 左操作符
    -表示负数
    +表示正数
    sizeof求字节长度
    *解引用,间接访问操作符
    & 取地址
    ~按位取反
    !逻辑取反
    (类型)强制类型转换操作符
    ++ - -累加累减操作符
  • 右操作符
    ++ - -加加减减
    这里要区别左操作符和右操作符的区别:左操作符是先操作后使用,而右操作符是先使用后操作。举例:
int main()
{
	int a = 3, b = 4, c;
	c = (a++) + (++b);//3+5
	printf("%d %d %d\n", a, b, c);
	return 0;
}

输出结果为4,5,8初学者容易在第二行代码中产生困惑,其实质是等价于
b=b+1;
c=a+b;
a=a+1;

七.逗号运算符 ( , , )

逗号运算符就是用逗号隔开几个表达式,并且运算的结果为最后一个表达式的值。
举例:

int main()
{
	int a = 2, b = 3, c;
	c = (a < b, b++, b + a);
	printf("%d\n", c);
	return 0;
}

上面的逗号运算符那一行相当于:执行了
a<b;
b++;
c=a+b;这三行代码,但是显然分开写看起来更加清楚。逗号运算符在实际中用的并不多。

八.条件运算符( ?:)

有一种if语句判别表达式为真或者为假时,都执行一个赋值语句且赋值给同一个变量。如:

int a=12, b=14, max;
	if (a <b)
	{
		max = b;
	}
	else
	{
		max = a;
	}

c语言提供条件运算符来专门处理这类问题,上面的if语句就可以写成a<b?b:a;该语句和上面的if语句逻辑完全相同。当前面的表达式为真时返回:前面的数,否则返回:后面的数
条件运算符由两个符号组成,要求有三个操作对象,称为三目操作符,它也是c语言中唯一一个三目操作符。

九.下标访问,函数调用,结构体成员访问操作符 [] () . ->

下标访问操作符在c语言中只用于数组,但是由于指针和数组有极多的相似之处,指针在c语言中也可以通过下标访问。举例:

int main()
{
	int arr[5] = { 1, 5, 7, 8, 9 };
	int *p = arr;
	printf("%d %d\n", arr[2], 3[arr]);
	printf("%d %d\n", p[2], 3[p]);
	return 0;
}

运行结果:
在这里插入图片描述
可看到 []对数据位置的控制并不严格,数组名(或指针名)可以和下标调换位置,但是我们平时还是把数字放在[]内,规范自己的代码!
注:《C专家编程》一书中,作者明确指出[ ]运算符作用于指针和数组名时,行为是不一样的。数组名与指针不同。想了解指针和数组的详细关系可以参看这本书。
函数调用运算符 函数名(传入实参)
函数调用操作符可以接受任意多个参数,第一个参数就是函数名,其余参数就是传递给函数的参数,并由调用函数来决定其余参数的类型和个数。
访问结构体成员操作符 . ->
结构体成员的变量可通过 . 访问结构体成员。
使用方fa:变量名.结构体成员名
结构体指针可以通过 -> 指向结构体成员
使用方法:结构体指针->结构体成员
举例:

struct Student
{
	int num;
	char name[20];
	char sex[4];
	int age;
};
int main()
{
	struct Student student = { 124, "张三", "男", 23 };
	struct Student* p = &student;
	printf("%d %s %s %d\n", student.num, student.name, p->sex, p->age);
	return 0;
}

运行结果:
在这里插入图片描述
到这里,c语言操作符基本就给大家罗列完了,但是看完这些操作符你并不一定能正确使用它们,因为在使用过程中你还不能完全掌握它们的优先级和结合性
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
那么问题出现了,优先级那么多,我需要都背下来吗?能背下来当然更好喽,不过记不下来也没关系,在使用中加上括号就行了,不管它哪个优先级高,都得按照我的逻辑来,这样就简单多了。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言中的string函数主要包括字符串的处理函数和字符串的操作函数。 字符串的处理函数主要有以下几个: 1. strlen:用于计算字符串的长度,即包含的字符数目。 2. strcpy:用于将一个字符串复制到另一个字符串中。 3. strcat:用于将两个字符串连接起来。 4. strcmp:用于比较两个字符串的大小关系。 5. strchr:用于在一个字符串中查找指定字符的位置。 6. strstr:用于在一个字符串中查找指定子串的位置。 字符串的操作函数主要有以下几个: 1. sprintf:用于将格式化的数据写入字符串中。 2. sscanf:用于从字符串中读取格式化的数据。 3. strtok:用于将一个字符串按照指定的分隔符进行分割。 4. strncmp:用于比较两个字符串的前n个字符的大小关系。 5. strncpy:用于将一个字符串的部分内容复制到另一个字符串中。 6. memset:用于给字符串的指定范围内的每个字符赋予相同的值。 这些函数可以帮助我们在C语言中方便地处理字符串,实现字符串的复制、连接、比较、查找等操作。通过这些函数,我们可以更高效地处理文本数据,提高代码的可读性和可维护性。 需要注意的是,使用这些函数时要确保输入的参数合法,以避免内存越界等错误。同时,字符串的内存空间需要提前分配好,以免出现不可预知的问题。在实际编程中,我们需要灵活运用这些函数,结合具体需求,进行字符串的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值