近期一段时间的学习,了解到很多新东西,一共有以下部分组成:
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