您现在的位置是:首页 >学无止境 >【C语言】操作符详解(二)网站首页学无止境
【C语言】操作符详解(二)
简介【C语言】操作符详解(二)
单目操作符
单目操作符的介绍
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
代码演示:
#include<stdio.h>
int main()
{
int a = -20;
int* p = NULL;
printf("%d
", !2);
printf("%d
", !0);
a = -a;
p = &a;
printf("%d
", sizeof(a));
printf("%d
", sizeof(int));
printf("%d
", sizeof a);
//printf("%d
", sizeof int);//error
printf("%p
", p);
return 0;
}
由此可以看出当sizeof计算字符的大小是可以直接在括号里面写声明的类型,也可以不用括号直接在后面写变量名。
sizeof和数组
下面是代码演示:
计算数组的大小
#include<stdio.h>
void test1(int arr[])
{
printf("%d
", sizeof(arr));
}
void test2(char arr[])
{
printf("%d
", sizeof(arr));
}
int main()
{
int arr1[10] = { 0 };
char arr2[10] = { 0 };
printf("%d
", sizeof(arr1));
printf("%d
", sizeof(arr2));
test1(arr1);
test2(arr2);
return 0;
}
为什么test1和test2函数打印的大小都是4呢?
因为传递过去的是一直指针,指针的大小和类型没有任何的关系,只和使用的编译器有关,如果是32位那么输出的就是4个字节,要是64位的输出就是8个字节。
++和–的运算
下面是代码演示:
#include<stdio.h>
int main()
{
int a = 3;
int b = 4;
printf("没有改变前a,b
");
printf("a=%d b=%d
", a, b);
int c = a++;
int d = ++b;
printf("改变后的a,b
");
printf("a=%d b=%d
", a, b);
printf("c=%d d=%d", c, d);
return 0;
}
从这里可以看出来:
- 当++在后面的时候是先赋值后自增;
- 当++在前面的时候是先自增后赋值。
当然–也和++一样的,在这里就不重复举例了。
关系操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 判断不相等
== 判断相等
#include<stdio.h>
int main()
{
int a = 4;
int b = 5;
int c = 4;
if (a!=b)
{
printf("呵呵
");
}
if (a == c)
{
printf("haha
");
}
if (a<b)
{
printf("你好
");
}
return 0;
}
这里用if语句判断条件来举例了一些关系操作符,当条件满足的时候进入if。
在编程的过程中== 和=不小心写错,导致的错误。
逻辑操作符
&& 逻辑与
|| 逻辑或
使用&&逻辑与时要条件都满足
使用||逻辑或时只要满足任何一个条件都可以
代码如下:
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d
b = %d
c = %d
d = %d
", a, b, c, d);
return 0;
}
结果为什么是这个呢?
因为a++后面跟着一个&&符号当a=0是后面的表达式就不需要计算了;
条件操作符
条件操作符也叫三目操作符
语法:
exp1 ? exp2 : exp3
比较两个数的大小
使用循环的代码如下:
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
if (a>b)
{
printf("a=%d", a);
}
else
{
printf("b=%d", b);
}
return 0;
}
我们还有没有更加简单的方法呢?答案是有的只需要一句话就可以解决,那就是条件操作符。
代码如下:
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int m = (a > b ? a : b);
printf("%d
", m);
return 0;
}
这样可以达到效果,而且代码看起来更加的少。
逗号表达式
语法:
exp1, exp2, exp3, …expN
- 逗号表达式,就是用逗号隔开的多个表达式。
- 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
代码如下:
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = (a > b, a++, b--, a + b);
printf("c=%d", c);
return 0;
}
下标引用、函数调用和结构成员
[]下标引用操作符
操作数:数组名和索引值
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
arr[i] = i;
}
printf("%d
", arr[7]);
return 0;
}
可以看出[]的两个操作数是arr和7.
()函数调用操作符
- 至少有一个操作数;
- 第一个操作数是函数名,其他的操作数是参数;
#include<stdio.h>
void test()
{
printf("haha
");
}
void test1(int arr[], int a)
{
for (int i = 0; i < a; i++)
{
printf("%d ", arr[i]);
}
printf("
");
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
test();
test1(arr, 10);
return 0;
}
访问一个结构体的成员
. 结构体.成员名
-> 结构体指针->成员名
使用.访问结构体成员
#include<stdio.h>
struct Sut
{
char name[10];
int age;
char sex[5];
double score;
};
int main()
{
struct Sut s1 = {"汤姆",25,"男",89.5};
struct Sut s2 = { "杰瑞",24,"男",90.5 };
printf("%s %d %s %.1lf
", s1.name, s1.age, s1.sex, s1.score);
printf("%s %d %s %.1lf
", s2.name, s2.age, s2.sex, s2.score);
return 0;
}
使用->访问结构体成员
#include<stdio.h>
struct Sut
{
char name[10];
int age;
char sex[5];
double score;
};
void Print(struct Sut* p)
{
//printf("%s %d %s %.1lf
", (*p).name, (*p).age, (*p).sex, (*p).score);
printf("%s %d %s %.1lf
", p->name,p->age,p->sex,p->score);
}
int main()
{
struct Sut s1 = { "汤姆",25,"男",89.5 };
struct Sut s2 = { "杰瑞",24,"男",90.5 };
Print(&s1);
Print(&s2);
return 0;
}
这就是单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式和下标引用表达式、函数调用、结构体成员的详解。希望都帮到大家。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。