期末备考

本文讲解了C语言中while循环的基本用法,函数的执行原理,传值与传址的区别,形参和实参的辨识,以及静态局部变量的作用。重点讨论了函数swap的正确实现以及strlen函数对字符串长度的计算,包括特殊字符处理。
摘要由CSDN通过智能技术生成

期末考C语言小白备考(1)

  1. while 开关判断
  2. 函数的执行
  3. 调用函数的传值与传址
  4. 形参和实参的辨别
  5. 静态全局变量的使用
  6. 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’后的数进行判断,由此当遇到八进制和十六进制的数应当有眼力辨别陷阱,进行正确的计数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值