首页 > 其他分享 >学习代码并分享Day5

学习代码并分享Day5

时间:2025-01-19 16:30:57浏览次数:3  
标签:右移 10 main 递归 int 代码 Day5 操作符 分享

近期一段时间的学习,了解到很多新东西,一共有以下部分组成:

1、递归

2、移位操作符

3、位操作符

4、逗号表达式

1、递归

递归就是函数自己调用自己

最简单的一个递归实例如下:

#include <stdio.h>

int main()
{
  printf("digui\n");
  main(); 

  return 0;
}

这段代码的确是递归代码,但在运行时会出现一种错误,叫做栈溢出

就是程序不停的调用main函数,导致原来程序运行之初给main函数开辟的空间不够用了,最终导致程序崩溃。
以下这张图片是运行时会产生的错误:
在这里插入图片描述
图片中显示了错误叫作Stack overflow,也就是栈溢出

接下来,我会用一个实例讲解函数递归:
实例:输入一个数字,要求依次打印出每一位。
输入:1234
输出:1 2 3 4

#include <stdio.h>

void f(int n)
{
	if (n > 9)
	{
		f(n / 10);
	}
	printf("%d ", n % 10);
}

int main()
{
	int n;
	scanf("%d", &n);
	f(n);

	return 0;
}

运行实例:
在这里插入图片描述
这个代码中f()函数,就是实现这个功能的核心部分,
假如输入1234;
1、n=1234 n>9 if条件成立跳进f(n/10)中,进入到2
2、n=123 n>9 if条件成立跳进f (n/10) 中,进入到3
3、n=12 n>9 if条件成立跳进f (n/10) 中,进入到4
4、n=1 n<9 if条件不成立,打印1 ,返回到3
3、n=12 这次调用函数中已经执行完if语句,会打印2 ,返回到2
2、n=123 这次调用函数中已经执行完if语句,会打印3 ,返回到1
1、n=1234 这次调用函数中已经执行完if语句,会打印4 ,程序结束。

经过我的一顿分析,我敢肯定已经听懂了。
感受到了递归的奥妙之后,我又学习了以下内容。

2、移位操作符

移位操作符只能针对整型的二进制进行操作
>> 右移操作符
<< 左移操作符
<< :左边直接丢弃,右边补0
例: 5的二进制是00000000000000000000000000000101
左移位后会变成00000000000000000000000000001010(10)
至于写这么长,是因为程序在处理时是根据补码进行操作的,而正数的补码是它本身。
>> :有两种情况,一种是逻辑右移,一种是算数右移。(取决于编译器本身,要区分的话用负数进行区分即可)逻辑右移是左边用0填充,右边丢弃。算数右移是左边用符号位填充,右边丢弃。
例: -5:的二进制10000000000000000000000000000101
它的反码:11111111111111111111111111111010
它的补码:11111111111111111111111111111011
右移后补码:11111111111111111111111111111101
右移后原码:10000000000000000000000000000011(-3)

3、位操作符

位操作符同样只能针对整型的二进制进行操作
按位与 &(都为1则为1,否则为0)
按位或 |(有一个为1则为1,否则为0)
按位异或 ^(相同为0,不同为1)
按位取反 ~(二进制补码为0的改为1,为1的改为0)

将位操作符与移位操作符之间相互配合,就可以达到意想不到的效果
如:计算整数在二进制状态下的1的个数,实例如下:

#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	int count=0;
	int i;
	for (i = 0;i < 32;i++)
	{
		count+=(n >> i) & 1;//判断最低位是0还是1,并用count加上该值用于计算每一位上的1
	}
	printf("%d", count);

	return 0;
}

运行结果:
在这里插入图片描述

4、逗号表达式

逗号经常被我忽略,但我没想到它也是表达式。
它的作用是从左到右,依次计算,整个表达式的结果就是最右边表达式的结果。
实例:

#include <stdio.h>

int main()
{
	int a = 3;
	int b = 0;
	int c = (b = a, a += 2, b += 3, a++ , b++ ,a + b, a = a + b);
	printf("%d", c);

	return 0;
}

运行结果:
在这里插入图片描述
一定要从左到右依次运算,c的最终结果是表达式 a = a + b 的结果。

今天的分享就到这里,编友们,记得互动哦,我们下次见!(*^▽^*)

标签:右移,10,main,递归,int,代码,Day5,操作符,分享
From: https://blog.csdn.net/2401_86785052/article/details/145242832

相关文章