当前位置:首页 > C语言课件
基础知识点
3.4 浮点型数据
? 对于一些算术运算(例如两个很大的数相减),使用浮点数会损失更多精度。
? 因为在任何区间内(比如1.0和2.0之间)都存在无穷多个实数,所以计算机浮点数
不能表示区域内所有的值。浮点数往往只是实际值的近似。
3.5.1转义字符(p48) 3.5.4 字符串常量
在字符串常量中, ' 和 ? 可以作为正常字符参与组合,但 \\ 和 \则仍需 \\ 来引导。 3.7 各类数值型数据间的混合运算(p54) Double float float 3.8.4 何时应该使用强制类型转换? 高
① 运算符要求的操作数不符合规定类型时; Long ② 指针类型与void *类型交换数据时;
③ 不转换得不到正确结果时; ④ 得到的运算结果与赋值的变量类型不一致时; Unsigned ⑤ 函数返回值与函数类型(限基本类型)不一致时。 低 4.4 字符数据的输入输出 Int char、short getchar函数
注意:如果输入的字符超过一个,多余的部分将被保存在缓冲区内,且每次仅处理一个字符。 转换说明 %c %d %i %e(%E) %f %g(%G) %o %p %s %u %x(%X) %% 修饰符: l L 输出 一个字符。 有符号十进制整数。 浮点数,e(E)-记数法。 浮点数,十进制记数法。 根据数值不同自动选择%f或%e(%E),%e(%E)格式在指数小于–4或者大于等于精度时使用。 无符号八进制整数。 一个指针。 字符串。 无符号十进制整数。 使用十六进制数字0f(0F)的无符号十六进制整数。 打印一个百分号。 和整数转换说明符一起使用,表示一个long int或unsigned long int类型值。示例:%ld %8lu 和浮点转换说明符一起使用,表示一个long double 值。 示例:%Lf .4Le - + 空格 项目是左对齐的。也就是说,会把项目打印在字段的左侧开始处。示例:%-20s 有符号的值若为正,则显示带加号的符号;若为负,则为带减号的符号。示例:%+6.2f 有符号的值若为正,则显示时带前导空格(不显示符号);若为负,则带减号符号。+标志会覆盖空格标志。示例:% 6.2f 使用转换说明符的可选形式。若为%o格式,则以0开始;若为%x或%X格式,则以0x或0X开始。对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点。对于%g和%G格式,它防止尾随零被删除。 示例:%#o %#8.0f %+#10.3E 对于所有的数字格式,用前导零而非空格填充字段宽度。如果出现-标志或者指定了精度(对于整数)则忽略该标志。示例:0d .3f # 0
4.5.4 打印长字符串
如果你必须分割一个字符串,有三个选项可供选择: printf( \ printf( \
printf( \
long string.\\n\
printf( \ \ /* ANSI C */
4.5.5 使用scanf( )
scanf( )可以读取各种格式的数据。当然,从键盘输入的是文本,因为那些键生成文本字符:字母、数字和标点。例如,当你想输入整数2004时,你键入字符2、0、0和4。如果想把它们存储成一个数值而非字符串,那么你的程序必须把这个字符串逐个字符地转换成数值,这就是scanf( )所做的工作!它把输入的字符串转换成各种形式:整数、浮点数、字符和C的字符串。
? 如果使用scanf( )把一个字符串读进一个字符数组中,请不要使用&。
char pet[30]; scanf( \
? scanf( )函数使用空白字符来决定怎样把输入分成几个字段。它依次把转换说明与字段相匹配,并跳过它们之间的空白字符。唯一的例外就是%c说明符,即使下一个字符是空白字符,它也会读取那个字符。
? 最后一点:当scanf( )把字符串放在一个指定的数组中时,它添加终止的'\\0'使得数组内容成为一个C字符串。 %o %p %u %x %X
5.1 关系运算符和关系表达式
把输入解释为一个有符号八进制整数。 把输入解释为一个指针(一个地址)。 把输入解释为一个无符号十进制整数。 把输入解释为一个有符号十六进制整数。 关系运算符也可以用于浮点数,但要小心,在浮点数比较中只能使用“<‖和―>‖,原因在于舍入误差可能造成两个逻辑上应该相等的数不相等。
对C来说,一个真表达式的值为1,而一个假表达式的值为0。 逻辑值:假——零 真——非零
5.3.3 把 else 与 if 配对
规则是如果没有花括号指明,else与和它最接近的一个if配对。尽管缩排使得else好像是与第一个if配对的,但要记住,编译器是忽略缩排的。 5.3.4 求值的顺序
while ( ( c = getchar( ) ) != ' ' && c != '\\n' )
这个结构建立一个循环读入字符,直到出现第一个空格或换行符。第一个子表达式给c赋值,然后c的值被用在第二个字表达式中。如果没有顺序保障,计算机可能试图在c被赋值之前判断第二个字表达式。 5.3.5 条件运算符
C提供一种简写方式来表示if else语句的一种形式。这被称为条件表达式,并使用条件运算符(? :)。这是个有三个操作数的分两部分的运算符。
表达式1 ? 表达式2 : 表达式3
当希望将两个可能的值中的一个赋给变量时,可以使用条件表达式。典型的例子是将两个值中的最大值赋给变量: max = (a > b) ? a : b; 5.4 switch 语句
紧跟在单词switch后面的圆括号里的表达式被求值,然后程序扫描标签列表。直到搜索到一个与该值相匹配的标签,然后程序跳到那一行。要是没有相匹配的标签怎么办?如果有被标记为default:的标签行,程序就跳到该行;否则程序继续处理跟在switch语句之后的语句。
break语句有什么作用呢?它导致程序脱离switch语句,跳到switch之后的下一条语句。如果没有break语句,从相匹配的标签到switch末尾的每一条语句都将被处理。
圆括号中的switch判断表达式应该具有整数值(包括char类型),case标签必须是整型(包括char类型)常量或者整数常量表达式(仅包含整数常量的表达式),不能用变量作为case标签。
6.2 用while语句实现循环
C函数一般都有一个由函数计算并返回给调用程序的返回值。printf( ) 和 scanf( ) 函数同样也有各自的返回值:
? printf( )返回所打印的字符的数目。如果有输出错误,那么printf( )会返回一个负数。printf( )的返回值是其打印输出用途的附带功能,通常很少被用到。使用返回值的一个可能原因是要检查输出错误。
? scanf( )返回成功读入的项目的个数。如果它没有读取任何项目(当它期望一个数字而你却键入了一个非数字字符串时就会发生这种情况)时,scanf( ) 会返回值0。当它检测到“文件结尾”时,它返回EOF(-1),我们可以使用scanf( )的返回值来检测和处理不匹配的输入。
status = scanf( \ while ( status == 1 ) { sum += num;
printf( \ status = scanf( \ }
因为输入的字符q不是数字,scanf( )就不能读入一个整数,所以它的返回值和status都是0,而q又被放回到输入队列中。实际上,不仅仅是q,任何非数字的输入都将使循环终止,但是提示用户输入q 比提示用户输入一个非数字字符要简单一些。从而实现了while循环正常的进行。
scanf( )的双重用法避免了在循环中进行交互式输入时的一个棘手的问题:我们如何告诉循环什么时候停止?例如,假定scanf( )没有返回值,那么在每次循环中唯一改变的就是num的值。虽然我们可以使用num的值来终止循环,比如使用 num>0 或 num!=0 来作为判断条件,但是这使我们不能输入特定的值,例如–3或0。我们也可以在循环中添加新的代码,例如在每次循环中询问“Do you wish to continue?
因为while循环是一个入口条件循环,所以程序必须在进入循环体之前获取输入并检查status的值。这就是程序在while之前有一个scanf( )调用的原因;要是循环继续执行,在循环中需要一个读语句,这样程序才可以获得下一个输入的状态。这就是程序在while循环的结尾处还有一个scanf( )的原因,它为下一次循环做准备。 6.3 用do … while语句实现循环
别忘了 while();后面的分号! 6.7.1 break语句
无论是for、while还是do循环,break语句的执行会使得程序立刻退出其所正在执行的循环。循环中的后续语句都被挑过,且循环也被中止了。 6.7.2 continue语句
continue语句和break语句类似,但它并不中止循环,而是正如其名字所昭示的那样,该语句使得其所执行的循环继续运行下一轮,而本轮中所有位于continue语句后的部分都被跳过。
? 离开循环,可用break替代。事实上break和continue都是goto语句的特殊形式。使用他们的好处是它们的名字就已经表明了它们能做的事情,并且因为他们不使用标签,也就不存在误放标签在错误位置的危险。
7.1.3 一维数组的初始化
int a[10]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
有时需要使用只读数组,也就是程序从数组中读取数值,但是程序不向数组中写数据。在这种情况下声明并初始化数组时,建议使用关键字const。
const float math[5]={ 3.142, 2.718, 0.618, 0.577, 4.669 }; 注 意!
一旦数组被定义,例如:int grades[100];
这就声明了grades是一个包含了100个整型元素的数组。 引用此数组的合法形式是使用下标0到99。请注意正确地使用下标!因为C不对数组是否越界进行检查。所以,如果引用grades的第150个元素,不一定会引起错误。但是,这样的用法即便结果不是不可预料的,也很可能会是你不希望看到的。
思考:
转换一个十进制正整数为其它进制(最高为16进制)。 7.3.5 字符串的输入输出
如果你明确指定了数组大小,请确保你为终止NULL字符留出了足够的空间。 char word[7] = { \char word[6] = { \
共分享92篇相关文档