C 语言学习笔记
本文最后更新于:1 年前
C 语言学习笔记
- for 语句比较适合初始化和增加步长都是单条语句并且逻辑相关的情形,因为它将循环控制语句集中放在一起, 且比 while 语句更紧凑。
- EOF(end of file)是文件结束指示符。
- 在该程序段中,for 循环语句的循环体是空的,这是因为所有工作都在测试(条件)部分与增加步长部分完成了。
- 但 C 语言的语法规则要求 for 循环语句必须有一个循环体,因此用单独的分号代替。单独的分号称为空语句,它正好能满足 for 语句的这一要求。把它单独放在一行是为了更加醒目。
- 单引号中的字符表示一个整型值,该值等于此字符在机器字符集中对应的数值,我们称之为字符常量。
- 我们通常把函数定义中圆括号内列表中出现的变量称为形式参数,而把函数调用中与形式参数对应的值称为实际参数。
- 函数不一定都有返回值。不带表达式的 return 语句将把控制权返回给调用者,但不返回有用的值。这等同于在到达函数的右终结花括号时,函数就“到达了尽头”。主调函数也可以忽 略函数返回的值。
- 对数组而言,const 限定符指定数组所有元素的值都不能被修改。
- C 语言提供了6 个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号 char、short、int、long 类型。
- 栈是一种限定仅在表尾进行插入和删除操作的线性表。
- 的优先级高于按位&,&a[0] 等价于 a+0 (其中a是数组名)指的是a[0]的地址,*&a[0] 等价于 a[0] 等价于 *a。
- int p 是指 p 是指向 int 类型的指针变量。
- 数组传递一定是传指针。
- continue 语句只用于循环语句,不用于 switch 语句。
- 作为一种良好的程序设计风格,在 switch 语句最后一个分支(即 default 分支)的后 面也加上一个 break 语句。这样做在逻辑上没有必要,但当我们需要向该 switch 语句后添加其它分支时,这种防范措施会降低犯错误的可能性。
- 因此,如果两个函数必须共享某些数据,而这两个函数互不调用对方,这种情况下最方便的方式便是把这些共享数据定义为外部变量,而不是作为函数参数传递。
- 名字的作用域指的是程序中可以使用该名字的部分。对于在函数开头声明的自动变量来说,其作用域是声明该变量名的函数。不同函数中声明的具有相同名字的各个局部变量之间没有任何关系。
- 函数的参数也是这样的,实际上可以将它看作是局部变量。外部变量或函数的作用域从声明它的地方开始,到其所在的(待编译的)文件的末尾结束。
- 在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其它文件可以通过 extern 声明来访问它(定义外部变量的源文件中也可以包含对该外部变量的extern 声明)。
- 外部变量的定义中必须指定数组的长度,但 extern 声明则不一定要指定数组的长度。 外部变量的初始化只能出现在其定义中。
- 在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为 0,register 声明只适用于自动变量以及函数的形式参数,而自动变量和寄存器变量的初值则没有定义(即初值为无用的信息)。
- 对于外部变量与静态变量来说,初始化表达式必须是常量表达式,且只初始化一次。
- 对于自动变量与寄存器变量来说,初始化表达式可以不是常量表达式,表达式中可以包含任意在此表达式之前已经定义的值,包括函数调用。
- int days[ ] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- C++中,全局阈只能声明、初始化变量; 不能用于赋值、运算、调用函数等!
- .如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件中,则必须在相应的变量声明中强制性地使用关键字 extern。
- 我们可以得出这样一个结论:对于某些中等规模的程序,最好只用一个头文件存放程序中各部分共享的对象。较大的程序需要使用更多的头文件,我们需要精心地组织它们。
- 变量的声明(包括初始化)除了可以紧跟在函数开始的花括号之后,还可以紧跟在任何其它标识复合语句开始的左花括号之后。以这 种方式声明的变量可以隐藏程序块外与之同名的变量,它们之间没有任何关系,并在与左花 括号匹配的右花括号出现之前一直存在。
- 在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为 0,而自动变量和寄存器变量的初值则没有定义(即初值为无用的信息)。
- 如果文件名用引号引起来,则在源文件所在位置查找该文件;如果在该位置没有找到文件,或者如果文件名是用尖括号<>括起来的,则将根据相应的规则查找该文件,这个规则同具体的实现有关。
- 宏替换只对记号进行,对括在引号中的字符串不起作用。
- 在#if 语句中可以使用表达式defined(名字),该表达式的值遵循下列规则:当名字已经定义时,其值为 1;否则,其值为 0。
- 指向 void 类型的指针可以存放指向任何类型的指针,但它不能间接引用其自身。
- 类似于和++这样的一元运算符遵循从右至左的结合顺序。
- gets()是在stdio.h中是输入函数,使用类型:gets(str)。可以从标准输入类中读取一行字符到指定的字符串中,它在遇到EOF和回车换行键才会接受。但是由于功能强大,gets()和scanf()混合使用会导致gets()无法接受字符串,因为scanf回车结束的时,回车键留在了缓冲区,这时gets就无法区分这个空格是否属于gets的输入。gets会接受到这个信号,无法直接接受后续的字符串。
- 解决办法:(1):先gets后scanf,不让那gets读取回车;(2):利用getchar判断,获取\n,后执行gets.
- %g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的0。
- C 语言保证,0 永远不是有效的数据地址。
- 指针与整数之间不能相互转换,但 0 是惟一的例外:常量 0 可以赋值给指针,指针也可以和常量 0 进行比较。程序中经常用符号常量 NULL 代替常量 0,这样便于更清晰地说明常量 0 是指针的一个特殊值。符号常量 NULL 定义在标准头文件<stddef.h>中。
- 任何指针与 0 进行相等或不等的比较运算都有意义。但是,指向不同数组的元素的指针之间的算术或比较运算没有定义。(这里有一个特例:指针的算术运算中可使用数组最 后一个元素的下一个元素的地址。)
- 字符串常量是一个字符数组。
- 数组形字符串(例:char a[ ]=”hhhh”) 存放在全局数据区或栈区,可读可写。指针字符串(char p=”hhh” )存放在常量区,只读不能写。
- UNIX 系统中的 C 语言程序有一个公共的约定:以负号开头的参数表示一个可选标志或参数。
- 因为[]与操作数的结合优先级比 * 和 ++ 高,* 和 ++ 优先级一样,但从右至左结合;* 是一个前缀运算符,其优先级低于()。
- 运算符 . 和 -> 都是从左至右结合的。
- 在所有运算符中,下面 4 个运算符的优先级最高:结构运算符 “.” 和 “->” 、用于函数调用的 “()” 以及用于下标的 “[]” ,因此,它们同操作数之间的结合也最紧密。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!