第2章 基本概念
- 1. 学习笔记
- 2. 书后练习
- 问题4
- 问题7
- 问题8
- 问题11
- 编程练习2
1. 学习笔记
- 三字母词(trigraphs),就是三个连续的字符合起来表示另一个字符。三字母词使C环境可以在某些缺少一些必须字符的字符集上实现。虽然trigraphs曾经在C语言的标准中存在,但它们在现代编程中已经不太常见了,因为大多数现代编译器都支持直接输入特殊字符。trigraphs的使用已经被视为过时和不推荐,因为它们通常会导致代码的可读性下降,增加代码的混乱度。因此,大多数开发者会选择直接使用标准的ASCII字符来表示它们想要的特殊字符。我用的是CLion自带的gcc编译器给我警告
Trigraph ignored
,证明现在的编译器确实不再使用trigraphs了。
??( 表示 [ ??< 表示 { ??= 表示 #
??) 表示 ] ??> 表示 } ??/ 表示 \
??! 表示 | ??' 表示 ^ ??- 表示 ~
就比如说如果输出语句是printf( "Delete file (are you really sure??): " );
,得到的结果中就会包含字符’]'。
\ddd
ddd表示1~3个八进制数字。这个转义符表示的字符就是给定的八进制数值所代表的字符。\xddd
与上述类似,只是八进制数换成了十六进制数。- CLion中控制台无法结束输入问题,按照https://ask.csdn.net/questions/275371的要求进行设置,输入结束后Ctrl+D结束输入。
2. 书后练习
问题4
\40的值是多少?\100、\x40、\x100、\0123、\x0123的值又分别是多少?
\40 代表八进制数 换成十进制为32 在ASCII表中表示空格
\100 代表八进制数 换成十进制为64 在ASCII表中表示@
\x40 代表十六进制数 换成十进制为64 在ASCII表中表示@
\x100 代表十六进制数 换成十进制为256 超过字符最大存储范围127
\0123 没有这种表示方式
\x0123 没有这种表示方式
问题7
是非题:因为C(除了预处理指令之外)是一种自由形式的语言,唯一规定程序应如何编写的规则就是语法规则,所以程序实际看上去的样子无关紧要。
虽然这种说法是正确的,但是最好还是注意编码规范,便于维护和修改
问题8
下面程序中的循环是否正确?
#include <stdio.h>int
main( void )
{
int x, y;x = 0;
while( x < 10 ){y = x * x;printf( "%d\t%d\n", x, y );x += 1;
}
这个程序中的循环是否正确?
#include <stdio.h>int
main( void )
{int x, y;x = 0;while( x < 10 ){y = x * x;printf( "%d\t%d\n", x, y);x += 1;
}
两个程序中的while循环都缺少}
问题11
假定你有一个C程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下所示:
文件 | 包含文件 |
---|---|
main.c | stdio.h,table.h |
list.c | lish.h |
symbol.c | symbol.h |
table.c | table.h |
table.h | symbol.h,list.h |
如果你对list.c做了修改,哪些文件需要重新编译?如果是lish.h或者table.h做了修改,又有哪些文件需要重新编译?
当一个头文件被修改时,所有包含它的文件都必须重新编译
list.c
list.c main.c table.c
main.c table.c
编程练习2
编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确地成对出现。注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。
/** 编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确地成对出现。* 注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。* */
#include <stdio.h>
#include <stdlib.h>int main( int argc, char *argv[] ) {char ch;int count = 0;while ( ( ch = getchar() ) != EOF ) {if ( ch == '{' ) {count++;}if ( ch == '}' ) {if ( count == 0 ) { // 没有与}匹配的{printf( "error! redundant \'}\' " );}count--;}}if ( count != 0 ) { // 没有与{匹配的}printf( "error! redundant \'}\' " );}return EXIT_SUCCESS;
}