携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
单目操作符
//单目操作符就是只有一个操作数的操作符!
+ - ! sizeof() ++ -- ~ * (类型)
+-
这里的+ -都是单目操作符,并不是算数操作符中的+-!
a=-5; //-5这里的-指的是单目操作符!
b=+5; //+5 +可以省略!
!
逻辑反操作符
while(a!=0) //这里就是!逻辑反操作符
{
count++; //a不为0count++;
}
while(!a)
{
count++; //a为0count++;
}
sizeof
是否感到很诧异,sizeof居然是操作符!
sizeof是比较特殊的一个操作符,并不是函数!
我们知道sizeof可以计算一个变量和类型的所占空间内存大小!
int main()
{
int a = -10;
int* p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a); //这样写行不行?
printf("%d\n", sizeof int);//这样写行不行?
return 0;
}
可以看到当
sizeof计算一个类型时,不添加括号,就会报错,然而计算一个变量的大小时却可以省略括号!
总结:sizeof计算类型所占内存大小时,括号不可省略。sizeof(类型),计算变量所占内存大小时,sizeof(变量),sizeof变量
将错误更改一下,看一下运行结果!
sizeof和数组
我们知道sizeof可以计算变量的空间大小,所以我们经常通过sizeof计算一个数组的元素个数!
公式:sizeof(数组)/sizeof(数组的一个元素)
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
问: (1)、(2)两个地方分别输出多少? (3)、(4)两个地方分别输出多少?
我们先通过自己计算一下!
计算结果!
(1)40 (2) 40 (3)10 (4) 10
而运行结果!
可以看到,运行结果并不是那样!
我们在思考一下这个结果,为啥结果会是
4?
我们明明是将数组,直接传参过去 ,而通过sizeof计算的内存大小却不是,难道我们只传参了一个地址过去?
我们调试一下,发现就是假设的这样,数组传参并没有将整个数组传参过去,而是传参了一个指针!
而我们在
x86也就是32位平台下,指针所占内存空间大小为4个字节。
++ --
//前置++和--:
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;
//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
int y = --a;
//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
return 0;
}
//后置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++;
//先对a先使用,再增加,这样x的值是10;之后a变成11;
int y = a--;
//先对a先使用,再自减,这样y的值是11;之后a变成10;
return 0;
}
总结: 前置++,--先进行自加操作,再使用!
后置++,--先使用再进行自加操作!