第一章:
1、结构体的赋值操作,能不能直接赋值,直接赋值的结果是什么?
2、编写程序文本、编译、加载、运行、输出
3、执行时为什么是 ./a.out,而不直接是 a.out?
4、C语言程序:由函数和变量组成。什么是程序?
5、函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值(称为参数)列表。
6、一行是怎么定义的,\n换行符。
7、无法输入的字符或不可见字符,要用于编程实践体验一下(练习1-2)
8、程序中允许出现空格、制表符或换行符之处,都可以使用注释。什么地方可以出现,什么地方不可以出现?
9、所有变量都必须先声明后使用。什么是声明,什么是定义?声明用于说明变量的属性,它由一个类型和一个变量表组成。
10、基本数据类型:char、 short、int、long、float、double,大小取决于具体的机器。
11、还存在这些基本数据类型的数组、结构、联合,指向这些类型的指针以及返回这些类型值的函数。
12、每行只写一条语句,并在运算符两边各加上一个空格字符
13、整数除法操作执行舍位,所以在表达式中要注意。比如:要写成 celsius = 5 * (fahr - 32) / 9,而不要写成celsius = (fahr - 32) * 5 / 9。但是浮点数相除不进行舍位操作,如 5.0 / 9.0 (即使浮点常量取的是整形值,在书写时最好还是为它加上一个显式的小数点,便于阅读)
14、标准库函数有哪些,具体的实现是怎么样的?
15、 C语言中的一个能用规则:在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式。
16、for语句比较适合初始化和增加步长都是单条语句并且逻辑相关的情形
17、符号常量:在程序中使用“幻数”不是一个好习惯。 #define 名字 替换文本
18、字符输入输出
19、函数返回值是怎么回事? return 语句之后的值返回到哪里了? return 跟的是局部变量和静态变量或是椎内存有什么区别?
20、函数的定义,原型,用法要一致。函数原型与函数声明中参数名不要求相同。
21、参数--传值调用。在C语言中,所有函数参数都是“通过值“传递的。也就是说,传递给被调用函数的参数值在放在临时变量中,而不是在放在原来的变量中。在C语言中,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。
22、必要时,也可以让函数能够修改主调函数中的变量。这种情况下,调用者需要向被调用函数提供待设置值的变量的地址 (从技术角度看,地址就是指向变量的指针),而被调用函数则需要将对应的参数声明为指针类型,并通过它间接访问变量。
23、如果是数组参数,情况就有所不同了。当把数组名用作参数时,传递给函数的值是数组起始元素的位置或地址--它并不复制数组元素本身。 在被调用函数中,可以通过数组下标访问或修改数组元素的修值。
24、字符数组。(读入一组文本,并把最长的行打印出来)
25、自动变量 (局部变量)只在函数被调用执行期间存在,因此,在两次调用之间,自动变量不保留前次调用时的赋值,肯在每次进入函数时都要显式为其赋值。
26、外部变量,可在函数间交换数据
27、为了与老版本的C语言程序兼容,ANSI C语言把空参数表看成老版本C语言的声明方式,并且对参数表不再进行任何检查。在ANSI C中,如果要声明空参数表,则必须使用关键字void进行显式声明。
28、定义 表示创建变量或分配存储单元,而 声明 指的是说明变量的性质,但并不分配存储单元。
29、作用域
------------------------------------------------------------------------------------------------------------------------------------
第二章:
1、变量与常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初值。运算符指定将要进行的操作。表达式则把变量与常量组合直来生成新的值。对象的类型决定该对象可取值的集合以及可以对该对象执行的操作。
2、所有整形都包括 signed(带符号)和 unsigned(无符号)两种形式,且可以表示无符号常量与十六进制字符常量。
3、C语言的变量名区别大小写。变量名使用小写字母,符号常量全部使用大写字母。(什么是内部名,什么是外部名) 最长的变量名是多长?保留的关键字有哪些?变量名的命名规则有哪些?
4、基本数据类型:char,int,float,double。此外,可以在这些基本数据类型的前面加上一些限定符。short与long两个限定符用于限定整形。
5、各编译器可以根据硬件特性自主选择合适的类型长度,但要遵循下列限制:short与int类型至少为116位,而long类型至少为32位,并且 short类型不得长于int类型,而int类型不得长于long类型。
6、类型限定符signed与unsigned可用于限定char类型或任何整形。不带限定符的char类型对象是否带符号则取决于具体机器,但可打印字符问题正值。
7、有关类型长度定义的符号常量以及其他与机器和编译器有关的属性可以在标准头文件 limits.h 与 float.h 中找到。
8、没有后缀的浮点数常量为double类型。后缀f或F表示 float类型,而后缀l或L则表示long double类型。
9、各类常量:整型常量、浮点常量、字符常量、常量表达式、字符串常量、枚举常量
10、枚举是一个常量整形值列表。不同枚举中的名字必须互不相同。同一枚举中不同的名字可以具有相同的值。
11、相对于#define 来说,枚举的常量值可以自动生成。尽管可以声明enum类型的变量,但编译器不检查这种类型的变量中存储的值是否为该枚举的有效值。不过,枚举变量提供这种检查,因此枚举比#define更具优势,此外,调试程序可以以符号形式打印出枚举变量的值。英语原文是:Enumerations provide a convenient way to associate constant values with names, an alternative to #define with the advantage that the values can be generated for you. Although variables of enum types may be declared, compilers need not check that what you store in such a variable is a valid value for the enumeration. Nevertheless, enumeration variables offer the chance of checking and so are often better than #defines. In addition, a debugger may be able to print values of enumeration variables in their symbolic form.
12、所有变量都必须先声明后使用。可以在声明的同时对变量进行初始化。
13、如果变量不是自动变量,则只能进行一次初始化操作。
14、默认情况下,外部变量与静态变量都被初始化为0,未经显式初始化的自动变量的值为未定义值(即无效值)
15、任何变量的声明都可以使用const 限定符,该限定符指定变量的值不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改。const也可以配合数组参数使用,它表明函数不能修改数组元素的值。
16、取模运算符%不能应用于float或double类型。在有负操作数的情况下,整数除法截取的方向以及取模运算结果的符号取决于具体机器的实现,这和处理上溢或下溢的情况是一样的。(上溢和下溢是怎么处理的?)
17、运算符:算术运算符、关系运算符、逻辑运算符
18、如何用好&& ||,在有多测试条件的情况下,哪个写在先,哪个写在后,需要精心安排。
19、对于逻辑非运算符!的一般用法是:if(!valid),而不是 if(valid == 0)
20、当一个运算符的几个操作数类型不同时,就需要通过一些规则把它们转换为某种共同的类型。一般来说,自动转换 是指把“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信息的转换。
21、不允许使用无意义的表达式,例如,不允许把float类型的表达式作为下标。
22、针对可能导致信息丢失的表达式,编译器可能会给出警告,但这些表达式并不非法。
23、标准头文件定义了一组与字符集无关的测试和转换函数。
24、将字符类型转换为整形时,C语言没有指定char类型的变量是无符号变量还是带符号变量,当把一个char类型的值转换为int类型的值时,有可能为负数。取决于机器的结构。
25、 C语言的定义保证了机器的标准打印字符集中的字符不会是负值,因此,在表达式中这些字符问题正值。但是,存储在字符变量中的位模式在某些机器中可能是负的,而在另一些机器上可能是正的。
26、为了保证程序的可移植性,如果要在char类型的变量中存储非字符数据,最好指定signed或 unsigned限定符。
27、"真“意味着”非0“,如何用好NULL、NUL和0
28、C语言中,很多情况下会进行隐式的算术类型转换。这个很多情况是都包括什么情况?
29、如果没有unsigned类型的操作数,则只要使用下面这些非正式的规则就可以了:
a、如果其中一个操作数的类型为long double,则将另一个操作数转换为long double类型;
b、如果其中一个操作数的类型为 double,则将另一个操作数转换为double类型;
c、如果其中一个操作数的类型为float,则将另一个操作数转换为floate类型;
d、将char与short类型的操作数转换为int类型;
e、如果其中一个操作数的类型为long,则将另一个操作数转换为long类型;
30、注意,表达式中float类型的操作数不会自动转换为double类型,这一点与最初的定义有所不同。一般来说,数学函数(如标准头文件中定义的函数)使用双精度类型的变量。使用float类型主要是为了在使用较大的数组时节省存储空间,有时也为了节省机器执行时间(双精度算术运算特别费时)。
31、当表达式中包含unsigned类型的操作数时,转换规则要复杂一些。主要在于带符号值与无符号值之间的比较运算是与机器相关的。因为它们取决于机器中不同整数类型的大小。比如比较两个数的大小:-1L > 1U
32、赋值时也要进行类型转换。赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。
33、无论是否进行符号扩展,字符型变量都将被转换为整形变量。
33、当把较长的整数转换为较短的整数或char类型时,超出的高位部分将被丢弃。
34、当把dluble类型转换为 float类型时,是进行四舍五入还是截取取决于具体的实现。
35、 把参数传递给函数时也可能进行类型转换
36、在任何表达式中都可以使用一个称为 强制类型转换 的一元运算符强制进行显式类型转换。 (类型名)表达式,其准确含义是:表达式首先被赋值给类型名指定的类型的某个变量,然后再用该变量替换上述整条语句。
37、强制类型转换只是生成一个指定类型的n的值,n本身的值并没有改变。
38、在通常情况下,参数是通过函数原型声明的,这样,当函数被调用时,声明将对参数进行自动强制转换。
39、C语言提供了两个用于亦是递增与慈善的特殊运算符。++、--,它们既可以用作前缀运算符,也可以用作后缀运算符。
40、表达式 ++n 先将n的值递增1,然后再使用变量n的值,而表达式 n++ 则是先使用变量n的值,然后再将n的值递增1。也就是说,对于使用变量n的值的上下文来说,++n和n++的效果是不同的。
41、自增与自减运算符只能作用于变量,类似于表达式 (i+j)++ 是非法的。其他非法的方式???
42、在不需要使用任何具体且公需要递增变量的情况下,前缀方式和后缀方式的效果相同。但在某些情况下,需要酌情考虑。如何理解?何时用前缀,何时用后缀?
43、C语言提供了6个位操作运算符。这些运算符只能作用于整形操作数,即只能作用于带符号或无符号的char、short、int与long类型:& 按位与(AND), | 按位或(OR),^ 按位异或(XOR),<< 左移,>>右移 ,~按位求反(一元运算符)
44、按位或运算符&经常用于屏蔽某些二进制位;按位或运算符|常用于将某些二进制位置为1;按位民或运算符^当两个操作数的对应位不相同时将该位置为 1,否则,将该位设置为0。如何运用这些操作实现特定的目的?
45、区分位运算符&、|同逻辑运算符&&、||
46、移位运算符<<与>>分别用于将运算的左操作数左移与右移,移动的位数则由右操作数指定(右操作数的值必须是非负值)。
47、在对unsigned类型的无符号值进行右移位时,左边空出的部分将用0填补;当对signed类型的带符号值进行右移时,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
48、条件表达式 “ ? : ”,如 expr1 ? expr2 : expr3,首先计算expr1,如果其值不等于0(为真),则计算expr2的值,并以该值作为条件表达式的值,否则计算expr3的值,并以该值作为条件表达式的值。expr2与expr3中只能有一个表达式被计算。
49、条件表达式实际上就是一种表达式,它可以用在其他表达式可以使用的任何地方。如果expr1与expr3的类型不同,结果的类型将由前面讨论的转换规则决定。例如,如果f为float,n为int,那么表达式: ( n > 0 ) ? f : n,是float类型,与n是否为正值无关。
50、运算符的优先级与结合性:
51、同大多数语言一样,C语言没有指定同一运算符中多个操作数的计算顺序(&&、||、? : 和 ,运算符除外)。例如,在形如 x = f() + g() 的语句中,f() 可以在 g() 之前计算,也可以在 g() 之后计算。因此,如果函数 f 或 g 改变了另一个函数所使用的变量,那么 x 的结果可能会信赖于这两个函数的计算顺序。为了保证特定的计算顺序,可以把中间结果保存在临时变量中。
52、类似地,C语言也没有指定函数各参数的求值顺序。
53、函数调用、嵌套赋值语句、自增与自减运算符都有可能产生“副作用”--在对表达式求值的同时,修改了某些变量的值。在有副作用影响的表达式中,鞭执行结果同表达式中的变量被修改的顺序之间存在着微妙的信赖关系。C语言标准对大多数这类问题有意未作具体的规定。表达式何时会产生这种副作用(对变量赋值),将由编译器决定,因为最佳的求值顺序同机器结构有很大的关系。(ANSI C标准明确规定了所有对参数的副作用都必须在函数调用之前生效,但这对前面介绍的printf函数调用没有什么帮助)。
54、在任何一种编程语言中,如果代码的执行结果与求值顺序相反,则都是不好的程序设计风格。
------------------------------------------------------------------------------------------------------------------------------------
第三章:
1、程序语言中的控制流语句用于控制各计算操作执行的次序。
2、表达式之后加一个分号( ; )就变成了语句。
3、用一对花括号"{" 与"}"把一组声明和语句括在一起就构成了一个复合语句,也叫做程序块。复合语句在语法上千人于单条语句。在任何程序块中都可以声明变量。右花括号用于结束程序块,其后不需要分号。
4、if-else语句:用于条件判定。其中else部分是可选的,要防止省略else部分产生的歧义,解决的方法是加 {}。每个else都是与最近的前一个没有else配对的if进行匹配。
5、else-if语句:编写多路判定最常用的方法。其中的各表达式将被依次求值,一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。最后一个else部分用于处理“上述条件均不成立”的情况或默认情况,也就是当上面各条件都不满足时的情形。折半查找函数 binsearch()
6、switch语句是一种多路判定语句,它测试表达式是否与一些常量整数值中的某一个值匹配,并执行相应的分支动作。
switch(表达式)
{
case 常量表达式:语句序列
case 常量表达式:语句序列
default:语句序列
}
每一个分支都由一个或多个整数值常量或常量表达式标记。如果某个分支与表达式的值匹配,则从该分支开始执行。各分支表达式必须互不相同。如果没有哪一分支能匹配表达式,则执行标记为default的分支。各分支的排列次序是任意的。
7、break语句将导致程序的执行立即从switch语句中退出。在switch语句中,case的作用只是一个标号,因此,某个分支中的代码执行完后,程序将进入下一分支继续执行,除非在程序中显式地中转。跳出switch语句最常用的方法是使用break语句与 return语句。break语句还可强制控制从while、for与do循环语句中立即退出。
8、依次执行各分支的做法有优点也有缺点,好的一面是它可以把若干个分支组合在一起完成一个任务,但必须加上注释。一般为了防止直接进入下一个分支执行,每个分支后必须以一个break语句结束。
9、作为良好的程序设计风格,default分支的后面也加上一个break语句。
10、while循环和for循环。strtol函数、希尔排序。
11、逗号运算符“ , ”。被逗号运算符分隔的一对表达式将按照从左到右的顺序进行求值,各表达式右边的操作数的类型和值即为其结果的类型和值。某些情况下的逗号并不是逗号运算符,比如分隔函数的逗号,分隔声明中变量的逗号等,这些逗号并不保证各表达式按从左至右的顺序求值。应该慎用逗号运算符。
12、do-while 循环。itoa函数。特殊之处:循环体至少要执行一次,用在某些宏定义中,还有哪些用处?
13、break语句可用于从for、while与 do-while等循环中提前退出,就如同从switch语句中提前退出一样。break语句能使程序从switch语句或最内层循环中立即跳出。一个 break对应于一个循环,也就是说只能退出到上一级的循环。
14、continue语句用于使for、while或do-while语句开始下一次循环的执行。在while与do-while语句中,continue语句的执行意味着立即执行测试部分;在for循环中,则意味着使控制转移到递增循环变量部分。continue语句只用于循环语句,不用于switch语句。某个循环包含的switch语句中的continue语句,将导致进入下一次循环。
15、关于goto语句的作用:最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。
16、标号的命名同变量命名的形式相同,标号的后面要紧跟一个冒号。标号可以位于对应的goto语句所在函数的任何语句的前面。标号的作用域是整个函数。
------------------------------------------------------------------------------------------------------------------------------------
阅读(1846) | 评论(0) | 转发(0) |