登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 寒假学习笔记

[复制链接]
发表于 2018-1-25 06:59:48 | 显示全部楼层 |阅读模式
学习笔记
学习科目: C语言入门
学习安排: 在寒假时尽力学习基础的c语言运用
开始时间: 2018-01-19
结束时间: 2018-01-24
第一次发帖,大概总结一下前一段时间对于C语言学习的一点琐碎的心得吧。

函数原型:原型是一种声明的形式,用于告诉编译器您正在用一个特殊的函数。它也指明了函数的属性。
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。

参数与参量:例如:void pound(int n),该函数的返回值为空,可以理解为无返回值,不返回值。它定义了形式参数叫做n的int类型变量。像pound(10)这样的函数调用会把实际参数10传递给函数,然后函数把10赋给形式参数(变量n)。
C99规定:对于实际参数或者实际参量使用术语参量,对形式参数或形式参量使用属于参数。由此,我们可以说,参量是变量,而参数是由函数调用提供的值,并且将它赋给相对应的参量。

关于格式化输入/输出函数printf()与scanf()的返回值:c的函数一般都有一个返回值,这就是由函数计算并返回给调用程序的值。例如,C函数库包含一个sqrt()函数,它接受一个数字作为参数,并返回该参数的平方根。返回值可以赋给一个变量,也可以用在计算中,还可以作为参数传递。总之,它可以像其他任何值那样使用。
printf()函数也有一个返回值,它返回所打印的字符的数目。如果有输出错误,那么printf()会返回一个负数(老的版本可能会有一些不同的返回值)。
scanf()函数返回成功读入项目的个数,如果它没有读取任何项目(当它期望一个数字而您却键入了一个非数字字符串时就会发生这种情况),scanf()会返回值0。

两个名词:入口条件循环与退出条件循环:while循环与for循环都是入口条件循环,即在每次循环之前先检查判断条件,这样循环中的语句就有可能一次也不执行;do while循环是推出条件循环,即判断条件在执行循环之后进行检查。

逗号运算符:逗号运算符具有两个属性。首先,它保证被它分开的表达式按从左至右的顺序进行计算(换句话说,逗号是个顺序点,逗号左边产生的所有副作用都在程序运行到逗号右边之前生效);其次整个逗号表达式的值是右边成员的值。
例如x = (1,y=2);则x被赋值为2。

副作用和顺序点:表达式有两种功能:每个表达式都产生一个值,同时可能包含副作用。副作用是对数据对象或文件的修改。例如:n=5;这个语句的副作用是将变量n的值设置为5。这是副作用?这看起来更像是主要目的!然而,从C的角度来看,主要目的是对表达式求值,即主要目的是求得该表达式的值为5。
一个顺序点是程序执行中的一点;在该点处,所有的副作用都在进入下一步之前被计算。语句中的分号标志着一个顺序点,任何一个完整的表达式结束也是一个顺序点。它意味着在一个语句中赋值运算符、增量运算符及减量运算符所做的全部改变必须在程序进入下一个语句前发生。

增量运算符(++)与减量运算符(--):它们都有前缀与后缀两种运用方式,在运用中可能会有些不好理解。简单理解是:例如当n++是表达式的一部分时,可以认为是“先使用n,然后将它的值增加”,另一方面,++n的意思是“先将n值增加,然后再使用它”,减量运算符与之类似。遇到较为混合繁琐的运用时,不同的编译器可能以不同的顺序计算。
人活着,总要有些追求
 楼主| 发表于 2018-1-27 07:34:53 | 显示全部楼层
昨天知道了自己的英语成绩,老妈问我,我只是说了一个及格了,具体分数也不好意思说,然后老妈追问,我就让老妈猜一猜,突然就想到了这个程序,也算是学习一段时间C语言的一个简单应用吧。
#include <stdio.h>
int main(void)
{
        int n;
        n = 0;
        printf("What is my English grade?\n");
        scanf("%d", &n);
        while (n != 68)
        {
                if (n > 68)
                {
                        printf("No,it is up.\n");
                        scanf("%d", &n);
                }
                else
                {
                        printf("No,it is down.\n");
                        scanf("%d", &n);
                }
        }
        printf("Yes,that is my English grade!");
        return 0;
}
人活着,总要有些追求
发表于 2018-1-25 19:14:25 | 显示全部楼层
不错,继续加油,大学霸
好懒~~不想说~~~
 楼主| 发表于 2018-1-26 07:22:19 | 显示全部楼层
关于数组的溢出、越界问题:在上一次电子设计竞赛的时候就了解过相关的问题,但只是一知半解,今天又系统地学到了数组,在网上搜索了一些,看到了一个很形象的回答:越界就是你打水的时候拿错桶了,溢出就是你打水的时候水满出来了。
很精辟,用我的理解说,就是溢出:赋予了数组多余的值,这部分值可能被分配到了RAM上别的位置,一般来说溢出不会出什么大问题,只是简单的舍弃了多余值,但还是要避免,网上有些相关的错误例子;越界,就是访问了数组之外的地址,如果访问的地址虽然越界但仍在RAM中,不会引起大问题,最多是把你不想改写的数据改写了;如果问的地址不在RAM中(很少发生),就有可能出现严重错误。
人活着,总要有些追求
 楼主| 发表于 2018-2-3 20:15:13 | 显示全部楼层
说来惭愧,这周进行了实践活动,也没有继续学习,更不要说学习笔记了。明天开始恢复学习,并进行记录。
人活着,总要有些追求
 楼主| 发表于 2018-2-4 20:39:20 | 显示全部楼层
关于跳转:教材上讲goto语句称为无条件转移语句将break与continue语句称作用来控制程序的流程转向的跳转语句,看似没有关联。但也正是因为这种无联系性,也加大了我在学习过程中的难度。但是最近我在一本书上看到了这样的一种说法:实际上,break和continue是goto的特殊形式,使用它们的好处是他们的名字表明它们意味着。什么;并且,因为它们不使用标签,所以不存在放错标签位置的潜在危险。这样理解的话,便清楚了许多:这三个语句都是跳转,只不过break与continue用于循环之中,那本书上也称之为循环辅助手段,作用如它们的名字所述,后者是跳出本次循环,前者是跳出当前所在循环;至于goto,则是跳转到指定位置。
人活着,总要有些追求
 楼主| 发表于 2018-2-7 15:29:52 | 显示全部楼层
C语言的输入:最初输入/输出函数并不是C定义的一部分。在我的理解,这是C强大的可移植性的一部分。流是一个理想化的数据流,实际输入或输出映射到这个数据流,即不同属性的多种类型的输入由流表示,它们就有了更多统一性。C对待输入和输出设备与其对待存储设备上的普通文件相同,即可以使用与处理文件相同的方法来处理输入。(C不管操作系统以何种方式检测到文件结尾,只要到达了文件结尾,scanf()或getchar()函数会返回一个常量EOF(END OF FILE),通常在头文件中定义EOF为常量-1。)这样,不管是什么输入,C都会将其看作一个个字节的流,不管是键盘输入亦或是文件。
人活着,总要有些追求
 楼主| 发表于 2018-2-10 21:09:57 | 显示全部楼层
关于函数:C语言中,函数是用于完成特定任务的程序代码的自包含单元。使用函数的好处:在程序中如果想要多次使用某种特定功能,那么只要编写一个合适的函数,就可以在通过任何需要的地方调用完成该功能的函数来实现;即使某种功能在程序中只使用一次,函数也可以让程序更加模块化,利于阅读、修改和完善。函数就像一个黑盒子,它能实现某种特定功能,并且黑盒子内的一切操作对于调用函数来说是不可见的,即被调用的函数不会改变调用函数的数据,除非使用间接运算符*直接对数据的地址进行操作。

关于递归:C允许一个函数调用它自己,这种调用过程被称作递归。递归一般可以代替循环语句使用,但一般来讲循环会更好一些。首先,因为每次递归调用都拥有自己的变量集合,所以就要占用较多的内存;每次递归调用都需要把新的变量集合存储在堆栈中。其次由于每次函数调用都需要花费一定的时间,递归的执行速度会较慢。举个例子:对于斐波那契数列,我们如果用递归表示的话如下:
long fi(int n)
{
        if (n > 2)
                return fi(n - 1) + fi(n - 2);
        else
                return 1;
}
假设调用函数fi(),第一级递归会创建变量n,接着它两次调用fi(),在第二级递归中又会创建两个变量n,上述两次调用中的每一次又进行了两次调用,因而在第三极调用中需要四个变量。因为每级调用需要的变量数是上一级变量数的两倍,所以变量的个数是以指数规律增长的!
这是一个比较极端的例子,但也表明了必须小心使用递归,尤其是当效率处在第一位的时候。
人活着,总要有些追求
 楼主| 发表于 2018-2-13 20:10:08 | 显示全部楼层
数组与指针:关于数组,早在点开电子设计竞赛的时候不少人就已经接触过了,当然,指针的困难传闻也早已听说。今天看了一些指针的内容,才知道数组与指针的关系如此密切:数组标记实际上是一种变相使用指针的形式。数组名同时是该数组首元素的地址。即假设已经生命了数组arr,那么表达式arr==&arr[0]的值为1,即真。C语言标准在描述数组是,同样借助了指针的概念,例如定义arr[n]时,意思是*(arr+n),即“寻址到内存中的arr,然后移动n个单位,再取出数值”。(arr[n]与*(arr+n)等价)
人活着,总要有些追求
 楼主| 发表于 2018-2-18 13:13:10 | 显示全部楼层
指针的运算:对指针加上一个整数,等价于对指针的值加上它指向的对象的字节大小。这个整数会和指针所指的类型字节数相乘,然后所得的结果加到初始地址上例如,
        int arr[] = { 1,9,3 };
        int *ptr1, *ptr2;
        ptr1 = arr;
        ptr2 = ptr1+1;
        printf("%d     %d\n", *ptr1, *ptr2);
        printf("%p     %p\n", ptr1, ptr2);
在我的编译器的结果为
1     9
00000077AEFDF828     00000077AEFDF82C(该地址为十六进制数值)
同理,指针可以进行减去整数或是两个指针之间的求差运算。当然也可以进行++或--运算,但是注意不能使用类似arr++的操作,因为++的操作数必须是可修改的左值,即可以被改变的变量。
人活着,总要有些追求
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表