期末考C语言小白备考(1)
- while 开关判断
- 函数的执行
- 调用函数的传值与传址
- 形参和实参的辨别
- 静态全局变量的使用
- strlen分析
1 while 判断
#include<stdio.h>
#include<math.h>
int f(int x)
{
int x;
if(x==1) return 1;
x=2*f(x-1)+1;
}
int main()
{
long long n;
while((n=getchar())!=EOF)
printf("%lld\n",/*(pow(2,n)-1)*/f(n));
return 0;
}
然后可以看到此时while判断条件完全相反,原因如下:
惯性理解上的失误即while判断条件是符合条件就继续执行直到它不符合条件上图中只有满足D时它才可以跳出循环。
2 函数的执行
首先明确main函数只有一个,函数从main开始执行,从main函数开始调用其他函数,且任意函数不可重复定义,但函数中可调用其他函数,并且函数科递归调用。
值得注意的是调用函数时,若实参是一个数组名,则向函数传递的是每个数组元素的首地址。
3 调用函数的传值和传址
#include<iostream>
using namespace std;
void swap(int a, int b)
{
int x;
x = a;
a = b;
b = x;
cout << a << " " << b << endl;
}
int main()
{
int a = 1, b = 2;
swap(a, b);
cout << a << " " << b << endl;
return 0;
}
结果仍没有更换其数值 由此可看出交换函数swap并没有改变主函数中a与b的值。
#include<iostream>
using namespace std;
void swap(int *a, int *b)
{
int x;
x = *a;
*a = *b;
*b = x;
cout << *a << " " << *b << endl;
}
int main()
{
int *a, *b, c = 1, d = 2;
a = &c;
b = &d;
swap(a, b);
cout << *a << " " << *b << endl;
return 0;
}
注意:在c++中,如果想在函数中更改某个指针的值,参数是指针是做不到更改其值的,应使用指针的指针来进行更改。因为参数传递的本质仍然是传值。
区别在于第一片代码传过去的是数值,由实参到形参传递,而调用结束,由于无返回值导致无法起到交换的效果,原因是形参无法向实参传递数值。
而传地址则不同,由于传导的是参数的地址,使用按地址传递的方式,那么地址就作为值传递给了函数,函数就可以直接对地址进行操作,那么函数的修改就可以作用在地址里从而保留下来。
4形参和实参的辨析
重点:::
实参和其对应的形参各占有独立的存储单元。
5静态局部变量的使用
当看到关键字 static 时需注意该变量只可被赋值一次 且赋值后重复调用时其值不会改变,即读写程序 看到调用函数时需特别注意局部变量的存在。
#include<stdio.h>
int fun(int a,int b)
{
static int n;
int m=0;
n-=a+1;
m+=b-2;
return (n+m);
}
int fun(int n)
{
static int f=1;
f=f*n;
return f;
}
int main()
{
int n=2,m=4;
printf("%d\n",fun(n,m));
printf("%d\n",fun(n,m));
return 0;
}
此时程序的出书结果为 -1 -4
6 strlen函数分析
先看几个实列
#include<stdio.h>
#include<string.h>
main()
{
char *p="abcd\0efgh\0";
printf("%d\n",strlen("\t\"\065\xff\n"));
printf("%d",strlen(p));
}
运行程序结果为 5 4
总体来说strlen遇到’\0’停止读取(不包含’\0’),用这个可以解释第二个输出为4的,但是看到第一个实列可以得出以下结论:
1.转义字符和格式字符都算作长度
2.strlen函数会对八进制和十六进制的数进行选择,即使出现’\0’也没有结束计数,由此得出该函数会对’\0’后的数进行判断,由此当遇到八进制和十六进制的数应当有眼力辨别陷阱,进行正确的计数。