今天主要学了以下几点:
1、函数的嵌套使用和链式访问
2、数组在函数间的传输
3、布尔类型
1、函数的嵌套使用和链式访问:
(1)函数可以嵌套调用(在一个函数内调用另一个函数),但不能嵌套定义(在一个函数内定义另一个函数)
函数嵌套的经典案例
printf("%d", printf("%d", printf("%d", 43)));//究极套娃,输出4321
解析如下
(2)链式访问:把一个函数的返回值作为另一个函数的参数
#include<string.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n", len);//输出6
printf("%d\n", strlen("abcdef"));//输出6
return 0;
}
2、数组在函数间的传输
int binary_search(int arr[], int x)
{
int right = 0;
int left = 0;
int mid = 0;
int sz = 0;
sz = sizeof(arr) / sizeof(arr[0]);
right = sz - 1;
while (left <= right)
{
mid = left + (right - left) / 2;
if (arr[mid] < x)
{
left = mid + 1;
}
else if (arr[mid] > x)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int input = 0;
scanf("%d", &input);
int ret = 0;
ret = binary_search(arr, input);
if (ret == -1)
{
printf("没找到");
}
else
{
printf("找到了,对应下标为%d", ret);
}
return 0;
}
//错误写法
在上面这段功能为在数组中寻找输入的数的代码中,用于计算数组大小的变量sz在函数binary_seach中被定义和计算,表面上似乎没有什么问题,但是在进行x64环境下测试时,就会发现,只有在输入1、2两个数字时才会输出“找到了”,而大于2的数字均无法被查找。这是因为,数组在传递过程中,为避免在传输过程中对整个数组的数据进行传输而占用大量空间,程序只是传输了数组的地址,也就是首元素的地址,在x64环境中,地址大小为64bit=8byte=2个int变量(x86环境下为32bit)所占的空间,所以此时sz=2,因此该程序只能用于查找1、2。正确的写法如下:
int binary_search(int arr[], int x, int sz)//此处的arr只是一个指针变量(大小为4或8bit)
{
int right = 0;
int left = 0;
int mid = 0;
right = sz - 1;
while (left <= right)
{
mid = left + (right - left) / 2;//防止溢出
if (arr[mid] < x)
{
left = mid + 1;
}
else if (arr[mid] > x)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int input = 0;
scanf("%d", &input);
int ret = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//此处sz不能在函数中定义,因为传过去的不是数组而是数组的首元素地址,而不是整个数组
//所以在函数内部计算一个函数参数部分的数组的元素个数时不靠谱的
ret = binary_search(arr, input, sz);//此处传数组名只需传数组名
if (ret == -1)
{
printf("没找到");
}
else
{
printf("找到了,对应下标为%d", ret);
}
//约定,找到返回下标,找不到返回-1
return 0;
}
3、布尔(bool)类型
C99中引入了布尔类型:bool 大小为1byte,是用来表示真假的变量
布尔类型只包含true和false,用于判断结果的返回,而当我们去查看其定义时,会发现它只是对1和0的封装,因此可以被代替
以下是对布尔类型的运用:
//利用bool(布尔)类型进行判断的返回,实际就是把0和1封装了一下
#include<math.h>
#include<stdbool.h>
bool test(int x)
{
int b = 0;
int flag = 1;
for (b = 2; b <= sqrt(x); b++)
{
if (x % b == 0)
{
flag = 0;
return false;
}
}
return true;
}
int main()
{
int a = 0;
int num = 0;
int c = 0;
for (a = 101; a <= 200; a += 2)
{
c += test(a);
if (test(a))
{
printf("%d\n", a);
}
}
printf("%d", c);
return 0;
}