C语言基础
编译和运行
一般系统中的环境包括翻译环境和执行环境。
翻译阶段
翻译环境简单来说就是将编写的高级程序翻译成目标代码,然后通过连接器进行连接,最后生成目标文件。如以下图示:
执行阶段
(1) 程序的执行必须载入内存。在这个过程中,是操纵系统来完成的。此时,那些不是存储在堆栈中的尚未初始化的变量在这个时候获取值。 (2) 启动程序开始,调用main() 函数 (3) 开始执行程序代码。程序将运用一个运行时堆栈,用于存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序的整个执行过程中将一直保留他们的值。 (4) 程序终止。
另附*C和指针*中第二章中最后两道题:
第一道题
题目:编写一个程序,它由3个函数组成,每个函数分别保存在一个单独的源文件中。 函数increment接受一个整形参数,它的返回值是该参数的值加1。increment函数应该位于文件increment.c 中。第二个函数称为negate,它也接收一个整形参数,它的返回值是该参数的负值。最后一个函数是main,保存于文件main.c中,它分别用参数10,0和-10调用另外两个参数,并打印结果。
思路:分别定义函数increment和negate,在主函数引用这两个函数。
代码如下:
increment.c :
1 int increment(int value) 2 { 3 return (value + 1); 4 }
negate.c:
1 int negate(int value) 2 { 3 return (0 - value); 4 }
main.c:
1 #include<stdio.h> 2 #include"increment.c" 3 #include"negate.c" 4 5 int main() 6 { 7 printf("%d\t%d\n", increment(10), negate(10)); 8 printf("%d\t%d\n", increment(0), negate(0)); 9 printf("%d\t%d\n", increment(-10), negate(-10)); 10 return 0; 11 }
总结:
(1)include<>和include"" 有什么区别?
include< file >编译程序会先到标准函数库中找文件 ,比如stdio.h,math.h等
include”file” 编译程序会先从当前目录中找文件,比如我们定义的这两个.c文件
(2)什么时候用头文件?什么时候使用.c 文件?
其实这个后缀没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。这样分开写成两个文件是一个良好的编程风格。
后缀为 .h 的文件是头文件,内含函数声明、宏定义、结构体定义等内容。
后缀为 .c 的文件是源文件,内含函数实现,变量定义等内容。
第二道题
题目:编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确地成对出现。
思路:
(1)遍历代码中左括号的个数;
(2)遍历代码中右括号的个数;
(3)判断左括号的个数与右括号的个数是否想相等。如果相等,则表明花括号成对出现。
代码如下:
1 /* 2 **时间:2017年9月28日 3 **难度:2星级 4 */ 5 6 #include<stdio.h> 7 #include<string.h> 8 9 int main() 10 { 11 int ch;//定义文件类型指针 12 int count_left = 0; //定义左花括号的个数 13 int count_right = 0; //定义右花括号的个数 14 FILE *fp;//判断命令行是否正确 15 16 if ((fp = fopen("E:\\Visual Stdio2013\\CAndPointer\\Source\\source.c", "r")) == NULL) 17 { 18 printf("The file can not be opened.\n");//打开操作不成功 19 return;//结束程序的执行 20 } 21 ch = fgetc(fp); //从fp所指文件的当前指针位置读取一个字符 22 while (ch != EOF) //判断刚读取的字符是否是文件结束符 23 { 24 if (ch=='{') 25 { 26 count_left++; 27 } 28 else if (ch == '}') 29 { 30 count_right++; 31 } 32 33 ch = fgetc(fp); //继续从fp所指文件中读取下一个字符 34 } //完成将fp所指文件的内容输出到屏幕上显示 35 36 printf("左花括号总数是%d个,右花括号总数是%d个\n", count_left, count_right); 37 38 if (count_left == count_right) 39 { 40 printf("花括号匹配成功\n"); 41 } 42 else 43 { 44 printf("花括号匹配不成功\n"); 45 } 46 47 fclose(fp); //关闭fp所指文件 48 }
总结:
文件的打开,关闭,读取内容操作。参见http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html