C语言零碎知识点(未完待续)

前言

博主是计算机系大一学生,大一上C语言学得不好,虽然会写一些代码,但质量不高且基础知识掌握得太差,遂决定于寒假进行复习。

复习计划

  1. 细读完《C程序设计语言》,补知识点。
  2. 整理大纲。
  3. 刷题。

不过这一篇文章主要是记录实施第一项过程中的零碎知识点和个人体会,会在全部过完之后再进行整理。参考书主要是

《C程序设计语言》 W.Kernighan & M.Ritchie 机械工业出版社
再次强调,只记录了 本人认为需要记录的东西,是查博主的漏补博主的缺,并不是知识点的全面总结或者是大纲梳理。如有错误,欢迎指出。

知识点

第一章 导言

  1. printf("\c");printf("c");输出相同,都输出cprintf("\");会编译错误。
  2. 如果某个算术运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型。
  3. printf("%3d %6d\n", fahr, celsius");默认右对齐。
  4. 在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式。
  5. 幻数:函数里面出现的常数。
    缺点:几乎无法向其他人提供任何信息,包括自己也可能忘记;难以修改。
    改进方法:赋予它们有特别意义的名字,用#define指令把符号名(或符号常量)定义为一个特定的字符串:#define 名字 替换文本
  6. 在没有输入时,getchar函数将返回一个特殊值,这个特殊值与任何实际字符都不同。这个值称为EOF(end of file, 文件结束)。如果需要ch != EOF,将ch声明为int型,是因为必须让它大到足以存放getchar函数返回的任何值,包括文件结束符EOF。
  7. EOF定义在头文件<stdio.h>中,是一个整型数,它与任何char类型的值都不相同。这里使用符号常量,可以确保程序不需要依赖于其对应的任何特定的数值。
  8. 记住 != 的优先级比 = 的优先级高。因此ch = getchar() != EOF等价于ch = (getchar() != EOF)
  9. 单独的分号称为空语句。
  10. '\n’是一个字符常量,是单个字符,在表达式中是一个整型数;而"\n"是一个仅包含一个字符的字符串常量。
  11. 逻辑与比逻辑或高一个优先级。
  12. 同一函数不能分割存放在多个文件中。
  13. 不带表达式的return语句将把控制权返回给调用者,但不返回有用的值。
  14. 在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没有必要使用extern声明。所以一般情况下,将所有外部变量都放在源文件开头处,以省略extern声明。

第二章 类型、运算符与表达式

  1. 由于库例程的名字通常以下划线开头,因此变量名最好不要以下划线开头。
  2. int,整型,通常反映了所用机器中整数的最自然长度。int类型通常为16位或32位,long类型通常为32位,short类型通常为16位。
  3. short和int类型至少为16位(2个字节),而long类型至少为32位(4个字节),并且short类型不得长于int类型,int类型不得长于long类型。
  4. 一个字节占8位,char类型占一个字节,即8位。
  5. long double,高精度浮点数。
  6. long类型的常量以字母l或L结尾,如123456789l或123456789L。
  7. 无符号常量以字母u或U结尾,后缀ul或UL表明是unsigned long类型。
  8. 如果一个整数太大以至于无法用int类型表示,也将被当作long类型处理。
  9. 没有后缀的浮点数常量为double类型,后缀f或F表示float类型,后缀为l或L的浮点数则表示long double类型。
  10. 常量表达式是仅仅包含常量的表达式。这种表达式在编译时求值,而不在运行时求值。它可以出现在常量可以出现的任何位置。eg.
#define MAXLINE 1000
#define LEAP 1
char line[MAXLINE+1];
int days[31+28+LEAP+31+30];
  1. strlen(s);返回的长度不包括’\0’。
  2. 不同枚举中的名字必须互不相同,同一枚举中不同的名字可以有相同的值。
  3. 枚举的意义:为建立常量值和名字之间的关联提供了一种便利的方式。相对于#define语句来说,它的优势在于常量值可以自动生成。
  4. 如果变量不是自动变量,则只能进行一次初始化操作。默认情况下,外部变量和静态变量将被初始化为0。
  5. 取模运算符不能用于float或double类型,在有负操作数的情况下,整数除法截取的方向以及取模运算结果的符号取决于具体机器的实现,这和处理上溢或下溢的情况是一样的。
  6. 优先级:单目运算符+、-高于双目的*、/、%,高于双目的+、-。
  7. 优先级:关系运算符的优先级比算术运算符的优先级低;相等性运算符(==、!=)优先级低于关系运算符(>、<、<=、>=);逻辑与(&&)高于逻辑或(||),两者都比关系运算符和相等性运算符低。
  8. const char msg[] = "warning: ";const限定符指定数组所有元素的值都不能被修改,const限定符也可配合数组参数使用,它表明函数不能修改数组元素的值:int strlen(const char[]);。如果试图修改const限定符限定的值,其结果取决于具体的实现。(?)
  9. 当一个运算符的操作数类型不同时,就需要通过一些规则把它们转换为某种共同的类型。一般来说,自动转换是指把“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信息的转换。针对可能导致信息丢失的表达式,编译器可能会给出警告但不非法。
  10. 由于函数调用的参数是表达式,所以在把参数传递给函数时也可能进行类型转换。在没有函数原型的情况下,char与short类型都将被转换为int类型,float类型会被转换为double类型。因此,即使调用函数的参数为char或float类型,我们也把函数参数声明为int或double类型。
  11. 位操作运算符只能作用于整型操作数,即只能作用于有符号或无符号的char、int、short、long类型。
  12. 按位左移、按位右移的右操作数必须是非负值。
  13. x *= y + 1;等价于x = x * (y + 1);。
  14. 如果f为float类型,n为int类型,那么表达式(n > 0) ? f : n是float类型,与n是否大于0无关。

第三章 控制流

  1. switch语句各分支表达式必须互不相同。default分支是可选的。各分支和default次序任意。
  2. break语句将导致程序执行立即从switch,while,for,do循环语句中退出。
  3. 跳出switch语句最常用的方法是使用break语句与return语句。
  4. 虽然没有必要,但作为一种良好编程风格,在default语句后面也加一个break;语句,当我们需要添加其他分支时,可降低犯错的可能性。
  5. goto语句最常见的用法是终止程序在某些深度嵌套结构中的运行。
  6. 所有使用了goto语句的程序代码都能改写成不带goto语句的程序,但可能会增加一些额外的重复测试或变量。且大多数情况下,使用goto语句的程序段比不使用goto语句的程序段难以理解和维护,所以尽量少使用goto语句。

第四章 函数与程序结构

  1. 函数定义中的各构成部分都可以省略。最简单的函数如下所示(该函数不执行任何操作也不返回任何值。这种函数有时很有用,它可以在程序开发期间用以保留位置,留待以后填充代码。如果函数定义中省略了返回值类型,则默认为int类型):
dummy(){}
  1. 先跳过

第五章 指针与数组

  1. 通常,对指针有意义的初始化值只能是0或表示地址的表达式。对后者而言,表达式所代表的地址是在此前已定义的具有适当类型的数据的地址。
  2. C语言保证,0永远不是有效的数据地址。因此,在返回地址时返回0可表示出现了异常。
  3. 指针和整数之间不能进行相互转换,但0是唯一的意外:常量0可以赋值给指针,指针也可以和常量0进行比较。程序中经常用符号常量NULL代替常量0,这样便于更加清晰地说明常量0是指针的一个特殊值。常量符号NULL定义在标准头文件<stddef.h>中。
  4. 任何指针与0进行相等或不等的比较运算都有意义。
  5. 有效的指针运算包括:

相同类型指针之间的赋值运算;
指针同整数之间的加法或减法运算;
指向相同数组中元素的两个指针的减法运算或比较运算;
将指针赋值为0或指针与0之间的比较运算。
其他所有形式的指针运算非法。

  1. 以下语句将把一个指向该字符数组的指针赋值给pmessage。
char *pmessage;
pmessage = "now is the time";

其他

标准io函数的调用

1. ch = getchar();//从键盘读入一个字符
2. putchar(ch);//在显示器上输出一个字符

输入输出的格式说明

类型输入格式输出格式
long%ld%ld
double%lf%f
float%f%f
long long%lld%lld

一些函数和它的函数库

函数等价
isdigit( c )c>=‘0’ && c<=‘9’<ctype.h>
tolower( c )将c转换为小写<ctype.h>
isspace( c )判断是否是空格符<ctype.h>

一些编程题

如有更好的方法,欢迎分享。本人也会不定期更新自己的想法。
  1. 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
1 >/*replace string of blanks with a single blank*/
#include<stdio.h>

int main()
{
    int ch;

    while((ch=getchar()) != EOF){
       if(ch!=' ')
       	putchar(ch);
       if(ch==' '){
        putchar(ch);
        while((ch=getchar())==' ');
        putchar(ch);
		}
    }

	return 0;

 }
  1. 编写一个程序,以每行一个单词的形式打印其输入。
/*print input one word per line*/
#include<stdio.h>

int main()
{
    int ch;

    while((ch=getchar()) != EOF){
        if(ch==' ' || ch=='\n' || ch=='\t'){
            ch = getchar();
            putchar('\n');
            putchar(ch);
        }
        else
            putchar(ch);
    }

	return 0;

 }
  1. 编写函数expand(s1, s2).
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值