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程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
1月前
|
NoSQL Java 编译器
C语言从入门到精通该怎样学?
持续学习与实践:编程是一门需要不断学习和实践的技能,要保持对新技术和新知识的敏感性,并持续进行编程实践。
34 1
|
2月前
|
存储 Java C语言
【C语言入门】初识C语言:掌握编程的基石
【C语言入门】初识C语言:掌握编程的基石
46 4
【C语言入门】初识C语言:掌握编程的基石
|
2月前
|
存储 Java 程序员
【C语言入门】C语言入门:探索编程世界的基础概念
【C语言入门】C语言入门:探索编程世界的基础概念
63 2
|
2月前
|
前端开发 C语言 C++
C语言入门02---环境搭建
C语言入门02---环境搭建
|
2月前
|
编译器 C语言 C++
C++从遗忘到入门问题之C++持从C语言的过渡问题如何解决
C++从遗忘到入门问题之C++持从C语言的过渡问题如何解决
|
3月前
|
存储 Web App开发 算法
c语言的简单入门
熟悉c语言(简单入门)
|
3月前
|
JavaScript C语言
|
3月前
|
存储 人工智能 Java
|
3月前
|
存储 程序员 Go