C语言入门篇(八)中

简介: C语言入门篇(八)

如果不创建临时变量(第三个变量),可以实现两个整数的交换吗?

回答是可以的


方法一:



#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  a = a + b;
  b = a - b;
  a = a - b;
  printf("交换前:a=%d b=%d\n", a, b);
  printf("交换后:a=%d b=%d\n", a, b);
  return 0;
}

🍤 运行结果:


06b1b38737df88f10e7975fbb744d7c4_bc79ef45de45490e85a7c1413c1e29eb.png


方法二:使用 ^ 操作符实现


#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  printf("交换前:a=%d b=%d\n", a, b);
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  printf("交换后:a=%d b=%d\n", a, b);
  return 0;
}

🍤 运行结果:

ecec61a7a76a0f7c2f032c77d8c7ee5f_c4105065e3f74357b0c3e2863436be19.png


异或操作符也支持交换律

例如:


//a^a -> 0
//a^0 = a
#include<stdio.h>
 int main()
{
  int a = 3;
  int b = 5;
  int c= a^b^a;
  int d= a^a^b;
  printf("%d %d\n", c, d);
  return 0;
}

🍤 图解:

a ^b ^a=b

bacb36d69443ed044d2be28370436e70_ac7c4cd0961e4dc7bb7c183735de0f04.png


同样地,a^a^b=a


🍤 运行结果:

060cd11a81ece891671a64f70cdeecde_be1897a95d4e4c70b6463de48af58d2d.png



实例2:求一个整数存储在内存中的二进制中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;
}
//方法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;
}


5. 赋值操作符


赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。


int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值

赋值操作符可以连续使用

例如:


int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值

这样的代码感觉怎么样?

那同样的语义,你看看:

x = y+1;
a = x;

可见,下面的写法更加清晰爽朗而且易于调试。


复合赋值符


+= 
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

这些运算符都可以写成复合的效果。

例如:


int x = 10;
x = x+10;
x += 10;//复合赋值,与上面等式等价
//但下面复合语句明显更加简洁。

其他运算符也是一样的道理。


6. 单目操作符


6.1 单目操作符介绍

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符)
(类型)       强制类型转换

🍩单目操作符只有一个操作数


实例1: !


// ! 操作符
//非 0 为真
#include<stdio.h>
int main()
{
  int flag = 5;
  if (flag == 0)
  {
    printf("hehe\n");
  }
  if (!flag)//这里当 flag 为假时,才会打印hehe
  {
    printf("hehe\n");
  }
  if (flag)
  {
    printf("haha\n");
  }
  return 0;
}

🍤 运行结果:


4af1497797dfa79d191e708dd186e126_6450d8fa9709463e842e02e900bc0be9.png


实例2: -


// - 操作符
#include<stdio.h>
int main()
{
  int a = 5;
  int b = -a;
  printf("%d\n", b);
  return 0;
}

🍤 运行结果:


02e6edcb97ff3832a6d2f8b764d72bf0_35d78c3778694c899c727d23c6e068cc.png


实例3: &


// & * 操作符
#include<stdio.h>
int main()
{
  int a = 10;
  //pa是指针变量
  int* pa = &a;//&-取地址操作符-取出a的地址
  *pa = 20;//解引用操作符(间接访问操作符)-单目操作符-通用pa中存放的地址,找到指向的空间(内容)
  //同时也更改了a 的内容
  int c = *pa;
  printf("a=%d c=%d\n",a, c);
  return 0;
}

🍤 运行结果:

8dce71564ba96aa4d885a69b09ddea5d_b8adc6d70d8b4d36b17acb3ea70fcee4.png


相关文章
|
1天前
|
编译器 C语言 C++
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(下)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
7 0
|
1天前
|
存储 安全 编译器
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(下)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
4 0
|
1天前
|
存储 编译器 C语言
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(中)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
4 0
|
1天前
|
自然语言处理 编译器 C语言
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(上)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
9 0
|
1天前
|
编译器 C语言 C++
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
5 0
|
1天前
|
Java 编译器 C#
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(上)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
11 0
|
5天前
|
C语言
C语言——入门分支与循环
C语言——入门分支与循环
4 0
|
6天前
|
编译器 C语言
函数深入解析(C语言基础入门)
函数深入解析(C语言基础入门)
|
6天前
|
C语言
数组深入剖析(C语言基础入门)
数组深入剖析(C语言基础入门)
|
6天前
|
算法 C语言 芯片
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)