C语言操作符深度解析(四)

目录

一、位操作符:&、|、^、~

二、逗号表达式

三、下标访问[]、函数调⽤()

3.1 []下标引⽤操作符

3 .2 函数调⽤操作符


一、位操作符:&、|、^、~

位操作符有:

&         //按位与

|         //按位或

^         //按位异或

~         //按位取反

:他们的操作数必须是整数。  

#include <stdio.h>

int main()
{
     int num1 = -3;
     int num2 = 5;
     printf("%d\n", num1 & num2);
     printf("%d\n", num1 | num2);
     printf("%d\n", num1 ^ num2);
     printf("%d\n", ~0);
     return 0;
}

 在这里提出一个小问题

不能创建临时变量(第三个变量),实现两个整数的交换。

答案:

#include <stdio.h>

int main()
{
     int a = 10;
     int b = 20;
     a = a^b;
     b = a^b;
     a = a^b;
     printf("a = %d b = %d\n", a, b);
     return 0;
}

        编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。

//⽅法1 

#include <stdio.h>

int main()
{
     int num = 10;
     int count= 0;//计数 
     while(num)
     {
         if(num%2 == 1)
         count++;
         num = num/2;
     }
     printf("⼆进制中1的个数 = %d\n", count);
     return 0;
}

//思考这样的实现⽅式有没有问题? 

//⽅法2: 

#include <stdio.h>

int main()
{
     int num = -1;
     int i = 0;
     int count = 0;//计数 
     for(i=0; i<32; i++)
     {
         if( num & (1 << i) )
         count++; 
     }
     printf("⼆进制中1的个数 = %d\n",count);
     return 0;
}

//思考还能不能更加优化,这⾥必须循环32次的。 

//⽅法3: 

#include <stdio.h>

int main()
{
     int num = -1;
     int i = 0;
     int count = 0;//计数 
     while(num)
     {
         count++;
         num = num&(num-1);
     }
    printf("⼆进制中1的个数 = %d\n",count);
    return 0;
}

//这种⽅式是不是很好?达到了优化的效果,但是难以想到。

⼆进制位置0或者置1

编写代码将13⼆进制序列的第5位修改为1,然后再改回0

13的2进制序列: 00000000000000000000000000001101

将第5位置为1后:00000000000000000000000000011101

将第5位再置为0:00000000000000000000000000001101

参考代码

#include <stdio.h>

int main()
{
     int a = 13;
     a = a | (1<<4);
     printf("a = %d\n", a);
     a = a & ~(1<<4);
     printf("a = %d\n", a);
     return 0;
}

 

二、逗号表达式

exp1, exp2, exp3, …expN

        逗号表达式,就是⽤逗号隔开的多个表达式。 逗号表达式,从左向右依次执⾏。

        整个表达式的结果是最后⼀个表达式的结果。  

//代码1 

int a = 1;

int b = 2;

int c = (a>b, a=b+10, a, b=a+1);//逗号表达式 
c是多少?

//代码2 

if (a =b + 1, c=a / 2, d > 0)

//代码3 
a = get_val();
count_val(a);

while (a > 0)
{
 //业务处理 
 //...

     a = get_val();
     count_val(a);
}

如果使⽤逗号表达式,改写:

while (a = get_val(), count_val(a), a>0)
{
 //业务处理 
}

三、下标访问[]、函数调⽤()

3.1 []下标引⽤操作符

        操作数:⼀个数组名+⼀个索引值(下标)

int arr[10];//创建数组 
arr[9] = 10;//实⽤下标引⽤操作符。 
[ ]的两个操作数是arr和9。

3 .2 函数调⽤操作符

        接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。

#include <stdio.h>

void test1()
{
     printf("hehe\n");
}

void test2(const char *str)
{
     printf("%s\n", str);
}

int main()
{
     test1(); //这⾥的()就是作为函数调⽤操作符。 
     test2("hello bit.");//这⾥的()就是函数调⽤操作符。 
     return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值