仅自己学习,不喜勿喷
1. cc helloworld.c (output is a.out) $ a.out --> hello, world!
#include <stdio.h>
main() /* main函数是特殊的,每个程序都是从名为 main 的函数作为执行的起点。也就是说每个程序都必须包含一个main函数 */
{
printf("hello, world!\n");
}
/*和*/是C语言中的注释
2. 在C语言中所有变量都必须先声明后使用
for(int i=0; i<=300; i+=20) 这种语法仅在C99中才被支持,因此如果想写成这样,必须用命令 $ cc -std=c99 temperature.c 才可以编译通过。否则:
需要先声明 int i; 然后再写for循环 for(i=0; i<=300, i+=20)
#include <stdio.h>
main()
{
int temp, i;
for(i=0; i<=300; i+=20)
{ /* 本来转换的公式是(5/9)*(F-32),但是我们使用了5*(i-32)/9这样的公式,是因为如果先计算5/9,整除运算符"/"会去掉小数点后面的,于是5/9=0,所有值=0 */
temp = 5 * (i-32) / 9;
printf("%3d\t%6d\n", i, temp); /* %3d和%6d使得打印时i的值占3个数字宽,temp占6个数字宽,这样就可以使temp右对齐,美观输出格式 */
}
}
注1:for循环执行: for比较适合这样一种循环:初值和增量都是单个语句并且是逻辑相关的
第一部分:i=0 是初始化部分,仅在进入循环前执行一次。
第二部分是用于控制循环的条件测试部分:i<=300这个条件要进行求值。如果所求得的值为真,那么就执行循环体(本例循环体中只包含一个printf函数调用语句)。
然后再执行第三部分i+=20加步长,并再次对条件求值。一旦求得的条件值为假,那么就终止循环的执行。
注2:printf函数打印格式:
%d 打印十进制整数
%ld 打印长整型变量,long
%6d 打印十进制整数,至少6个字符宽
%f 打印浮点数
%6f 打印浮点数,至少6个字符宽
%.2f 打印浮点数,小数点后有两位小数
%.0f 不打印小数点和小数部分,小数部分为0
%6.2f 打印浮点数,至少6个字符宽,小数点后有2位
%o 表示8进制数
%x 表示16进制数
%c 表示字符
%s 表示字符串
%% 表示%本身
3. 符号常量
#define 指令用于把符号定义为特定的字符串: #define 名字 替换文本。此后,程序中所有出现在define中的名字,如果既没有用引号括起来,也不是其他名字的一部分,都用对应的替换文本替换。替换文本可以是任何字符序列,而不仅限于数字
#include <stdio.h>
#define LOWER 0
#define UPPER 300
#define STEP 20
main()
{
int temp, i;
for(i=LOWER; i<=UPPER; i+=STEP)
{
temp = 5 * (i-32) / 9;
printf("%3d\t%6d\n", i, temp);
}
}
注:LOWER,UPPER,STEP是符号常量,而不是变量,因此不会出现在变量声明部分。符号常量通常都为大写字母,而且行尾没有分号!
4. 字符输入和输出
标准库中有几个函数用以控制一次读写一个字符,getchar函数在被调用时从文本流中读入下一个输入字符并将其作为结果值返回。
c = getchar(), c包含了输入流中的下一个字符
#include <stdio.h>
main(){
int c;
while((c = getchar()) != EOF){ /* EOF(end of file)是文件结束的标记,其值是在<stdio.h>库中定义的一个整数。这个特殊值不与任何实际字符想混淆*/
putchar(c);
}
}
注:这里c被声明为int,而不是声明为char!原因是:一个字符无论在键盘或者屏幕上以什么形式出现,在机器内部都是以位模式存储的。char类型就是专门用来存储这种字符数据的类型,当然任何整数类型也可以用来存储字符数据。而且之所以不把c说明为char类型,是因为c必须大到可以存任何字符变量意外,还要可以存储文件结束符EOF。
习题:编写一个程序,把它的输入复制到输出,并在此过程中将相连的多个空格用一个空格代替。
#include <stdio.h>
main(){
int c, lastc;
while((c = getchar()) != EOF){
if(c != ' '){
putchar(c);
}
if(c == ' '){
if(lastc != ' ')
putchar(c);
}
lastc = c;
}
}
可以把c和lastc理解为两个指针,c指的是当前while循环到的那个字符,lastc是当前c的前一个字符。在第二个判断if(c == ' ')中,去除掉了多余的空格,只输出了一个空格!在循环进入下一次前,将当前的c赋值给lastc,那么在下一次循环时,lastc就指的是上一次循环c所指的值。
习题:编写一个程序,以每行一个单词的形式打印输入。
#include <stdio.h>
main(){
int state = 1, c, lastc;
while((c = getchar()) != EOF){
if(c == ' ' || c == '\t' || c == '\n'){
state = 0; /* state=1 means in a word, =0 means out of a word*/
} else {
putchar(c);
}
if (state == 0){
putchar('\n');
state = 1;
}
}
}
5. 函数的局部变量,只在函数被调用的时候存在,函数执行完退出就消失。
6. 外部变量必须定义在所有函数之外,而且只能被定义一次,定义的目的是为之分配存储单元。使用外部变量,可以用extern显示的声明,也可以通过上下文隐式说明(外部变量的定义出现在所有函数之前,那就没有必要在函数中使用extern显式声明)。但一个工程中,如果使用了别的文件中定义的变量,那么一般都需要使用extern,通常,把extern说明,和函数的声明都放在头文件中,一次性include进来。