c语言相关练习学习有感 本文是我从csdn上一博主上看到 练习以及一些感悟
原题可以去看这个作者的C语言入门必做踩坑题《篇一》_wh128341的博客-CSDN博客
1.递归题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <stdio.h> int count = 0 ;int fib (int n) { count++; if (n == 0 ) { return 1 ; } else if (n == 1 ) { return 2 ; } else return fib (n - 1 ) + fib (n - 2 ); }int main () { int ret=fib (5 ); printf ("%d\n" , count); printf ("%d\n" , ret); return 0 ; }
2.栈返回问题,以及全局变量
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> int a = 1 ;void test () { int a = 2 ; a += 2 ; }int main () { test (); printf ("%d\n" , a); return 0 ; }
3.全局变量的初始化及数据存储,sizeof的使用与比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int i;//i作为全局变量,未初始化,都是0;signed型 int main() { i--;//-1 if (i > sizeof(i))//sizeof(i) 中计算的结果是unsigned型, //而此时的i却是一个signed型,两者进行比较,i强制类型转化为unsigned型 ,i为-1. //-1源码1000 0000 0000 0000 0000 0000 0000 0001 //反码1111 1111 1111 1111 1111 1111 1111 1110 //补码1111 1111 1111 1111 1111 1111 1111 1111 >远大于4 { printf(">");//因此结果是> } else { printf("<"); } return 0 ; }
4.数据存储,强制类型转换(有符号在char类型时就强制类型转换成int),数据截断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> int main () { unsigned char a = 200 ; unsigned char b = 100 ; unsigned char c = 0 ; c = a + b; printf ("%d %d\n" , a + b, c); return 0 ; }
5.二维数组,强制类型转换,
1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> int main () { int arr[2 ][5 ] = { {10 ,9 ,8 ,7 ,6 ,},{5 ,4 ,3 ,2 ,1 }}; int *ptr1 = (int *)(&arr + 1 ); int *ptr2 = (int *)(*(arr + 1 )); printf ("%d,%d" , *(ptr1 - 1 ), *(ptr2 - 1 )); return 0 ; }
6.强制类型转换
1 2 3 4 5 6 7 8 #include <stdio.h> int main () { int a[5 ] = { 5 ,4 ,3 ,2 ,1 }; int *ptr = (int *)(&a + 1 ); printf ("%d, %d" , *(a + 1 ), *(ptr - 1 )); return 0 ; }
7.联合体.大小计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> union un { short a[7 ]; int n; };int main () { printf ("%d" , sizeof (union un)); return 0 ; }
8.联合体数据存储.存储方式,大小端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> int main () { union un { short k; char i[2 ]; }*s, a; s = &a; s->i[0 ] = 0x39 ; s->i[1 ] = 0x38 ; printf ("%d %x\n" ,a.k, a.k); return 0 ; }
9.无符号型
1 2 3 4 5 6 7 8 9 10 11 int main () { unsigned char i = 7 ; int j = 0 ; for (; i > 0 ; i -= 3 ) { ++j; } printf ("%d" , j); return 0 ; }