#c语言学习08—操作符和表达式

操作符

分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

算术操作符
+ - * / %
移位操作符
移位操作符操作的都是数的补码,正数的反码 补码 原码相同,复数的原码需要计算

右移操作符>>
右移两种移位逻辑:
1.算术右移(默认)
最后边丢弃,整体向右移一位,并且最左边第一位的符号位保持不变
2.逻辑右移
最后边丢弃,整体向右移一位,并且最左边第一位的符号位用0补
并且,右移操作是对补码做右移操作
例:
-1
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
(>>-1):对-1的补码做算术右移操作
补码仍为:11111111 11111111 11111111 11111111
所以
原码仍为:10000000 00000000 00000000 00000001
所以
int a=-1;
a=a>>1;
printf(“%d”,a); a打印出来仍是-1

左移操作符
逻辑左移:
整体向左移一位,最右边用0补齐。
5
00000000 00000000 00000000 00000101
5<<1=10
00000000 00000000 00000000 00001010

位操作符

& 按位与
| 按位或
^ 按位与或

赋值操作符
复合赋值符
a=a+2 a+=2
a=a-2 a-=2
a=a2 a=2
a=a/2 a/=2
a=a%2 a%=2
a=a>>2 a>>=2
a=a<<2 a<<=2
a=a&2 a%=2

单目操作符
操作对象只有一个 的操作符
!逻辑反
-负值
+值
& 取地址
~ 对二进制数按位取反
sizeof 操作数的长度,单位:字节
int a=1;
int b=2;
printf(“%d”,sizeof(a=a+b));
printf(“%d”,a);
打印会发现 4 1;
4是因为int a就是占四个字节(以32为为例),1是因为size(表达式)不具备截断操作,不会赋值

void test1( int arr[])
{
    printf("%d\n",sizeof(arr));
}
void test2( char arr[])
{
    printf("%d\n",sizeof(arr));
}

int main()
{
    int arr[10]={0};
    char ch[10]={0};
    printf("%d\n",sizeof(arr));
    printf("%d\n",sizeof(ch));
    test1(arr);
    test2(ch);
    
    system("pause");
    return 0;
}

在这里插入图片描述
整型的存储单位是4字节,int arr[10]就是40个字节
字符型存储单位是2字节,char ch[10]就是10个字节
在函数调用时,传递的是数组地址,所以test1 test2输出的数组地址是8(64位)

逻辑操作符(区别于算术与和或)

&& 逻辑与
|| 逻辑或

int main()
{
  int i=0,a=0,b=2,c=3,d=4;
  i=a++&&++b&&d++;
  printf("a=%d\nb=%d\nc=%d\nd=%d",a,b,c,d);
    system("pause");
    return 0;
}

在这里插入图片描述
在计算i等于几时,a是a++,先用在加所以是用0和后面的数值相与,在a是0的情况下,后面与之相与根本不需要算,所以吧b d没有++

条件操作符

exp1?exp2:exp3;
解释:如果表达式exp1成立,则表达式exp2是返回值,否则就是exp3为返回值
逻辑等同于
if(a>5)
b=3;
else
b=-3;

int a=0;
int b=0;
b=(a>5?3:-3)

逗号表达式

由逗号隔开的多个表达式就是逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果
int c=(a>b,a=b+10,a,b=a+1)
if(a=b+1,c=a/2,d>0)

下表引用、函数调用和结构成员

[ ]下标引用操作符
操作数:一个数组名+一个索引值
arr[4] arr 和 4是[ ]的操作数
()函数调用操作符
sizeof(arr)
进入一个结构的成员操作符 . ->****
struct student
{
char name[20];
int age;
char id[20];
}
int main ()
{
int a=20;
struct stu1={“张三”,20,“201957506211”};
struct* pa=&stu1;
printf(“%s”,(*pa).name);
printf(“%s”,p->name);
printf(“%s”,stu1.name);//访问stu里面的name
return 0;
}

算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

越往上走越大,低位和高位相操作,要把低位算术转换成高位
如果某个操作符的各个操作数是不同的类型,那么除非统一操作数的类型,否则无法进行操作

操作符属性

复杂表达式的求值有三个因素

1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值