一:环境
C语言的程序执行要经历4个过程:
1、预处理
头文件展开 去注释 条件编译 宏替换
2、编译
预处理后的结果变成汇编语言
3、汇编
汇编语言变成二进制程序
4、链接
把项目中使用的方法链接到项目中
在linux下对应的指令是:
[hj@localhost test]$ vim test.c
[hj@localhost test]$ gcc -E test.c -o test.i
[hj@localhost test]$ gcc -S test.i -o test.s
[hj@localhost test]$ gcc -c test.i -o test.o
[hj@localhost test]$ gcc test.o -o test
[hj@localhost test]$ ls -l
total 40
-rwxrwxr-x. 1 hj hj 4638 Jul 16 06:09 test
-rw-rw-r--. 1 hj hj 70 Jul 16 06:07 test.c
-rw-rw-r--. 1 hj hj 17201 Jul 16 06:08 test.i
-rw-rw-r--. 1 hj hj 856 Jul 16 06:08 test.o
-rw-rw-r--. 1 hj hj 344 Jul 16 06:08 test.s
[hj@localhost test]$ ./test
hello world
浮点类型家族包括float、double 和long double类型。通常,,这些类型都分别提供单精度、双精度以及在某些支持拓展精度的机器上提供拓展精度。
注意:
long double 至少和double一样长,而double 至少和float一样长。标准同时规定了一个最小范围:所有的浮点类型至少能够容纳从10^-37到10^37之间的任何值。
浮点数字面值在默认下都是double类型的,除非它的后面跟一个L或l表示它是个long double类型的值。或者跟一个F或f表示它是一个float类型的值。
四、static关键字
(1)、
(2)、
代码块中的变量不管是静态变量还是自动变量都没有链接性
注意:静态全局变量如果没有初始化的话,默认为0
五、编程提示和总结
1、在scanf函数的标量参数前未添加&字符。
2、误用=操作符而不是==操作符来测试相等性。
3、始终要进行检查,确保数组不越界。
4、注释不要嵌套。
5、字符串常量中的字符被错误地解释为三字母词。
6、在定义类型的新名字时,使用typedef而不是#define。
7、使用名字常量而不是字面值常量。
8、用const声明其值不会修改的变量。
9、用到(ch=getchar()) !=EOF表达式记得将变量ch定义为整数变量。
10、scanf()函数返回的值为:正确按指定格式输入变量的个数;当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1
11、局部变量屏蔽全局变量
六、编程和问答
编译器会给出一个警告消息。运行程序时,如果这个long整型变量的值很小,在short变量范围内,那么结果不会有变化,但是当超过了short变量的范围,则会产生溢出,改变结果。
有些编译器字符的默认类型是无符号的,这就是它的用处。
否,任何一个给定的n个位的值只有2^n的组合,一个有符号的数和无符号的数仅有的区别在于他的一半值是怎么解释,在一个有符号数中,它们是负值,在一个无符号值中,它们是更大的正值
在代码块内部:这个变量是自auto变量,作用域只在这个代码块中,没有链接性。它在每次调用函数时重新初始化。在代码块外部:这个变量是static,作用域是整个源文件,有外部链接性。在程序开始运行之前,它被初始化一次。(从这四个方面去答)
两个答案都是错的,在函数内部定义变量,它的作用域只限于这个函数,用static修饰变量,只是改变了这个函数的存储的方式,不改变变量的作用域
1、判断花括号匹配问题
<span style="font-size:10px;">#include <stdio.h>
#include<stdlib.h>
int main()
{
int ch;
int count = 0;//定义一个计数器count
while((ch = getchar()) != EOF)//循环输入,EOF结束
{
if(ch == '{')
{
count ++;
}
//当遇到{时,计数器+1
if(ch == '}' && count == 0)
{
printf("不匹配\n");
system("pause");
return 0;
}
//当遇到}但计数器为0了,输出不匹配,即为}在{前边
if(ch == '}' && count !=0)
{
count --;
}
//当遇到}且计数器不为0时,计数器-1
}
if(count == 0)
{
printf("匹配!\n");
}
else
{
printf("不匹配!\n");
}//判断计数器count
system("pause");
return 0;
}</span>
2、转义字符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main2()
{
printf("\40"); //表示一个八进制的数字。八进制的40是32,所以输出空格。
printf("\100"); //八进制的100是64,输出@。
printf("\x40"); //16进制的40是64,输出@。
//printf("\x100"); //\x 最多跟两个数字,它不会像\一样 超出了三位,拆成其他的字符。这个肯定报错。
printf("\0123"); //反斜杠后面最多跟3个八进制的数,所以这个拆成了两个字符\012,3,先输出换行,再输出3.
printf("hello...\n");//"\0183" 因为8超出了8进制数,所以,最大取到01,所以是\01 8 3三个字符
//printf("\x0123"); //报错,\x 最多跟两个数字,它不会像\一样 超出了三位,拆成其他的字符。
system("pause");
return 0;
}
3、有转义字符的字符串求长度 (要分清0和\0的区别)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p3 = "abcdgr\afeji";
char *p = "abcdef'0'"; //单引号也是一个字符。
char p2[] = {'a','b','c','0'}; //字符0不是\0,字符数组没有\0,所以在后面查找\0,直到找到\0,才停止计算长度,这是个随机值。
int len = strlen(p);
printf("p = %d\n",len); //9
len = strlen(p2);
printf("p2 =%d\n",len); //15
len = strlen(p3); //这里要注意:p3 = 11,而不是12,斜杠后面跟的任何字符组合起来都是转义字符。字符长度不能把\当一个字符去数。
printf("p3 = %d\n",len);
printf("hello...\n");
system("pause");
return 0;
}