C语言程序组成:函数和变量
每个程序都从main函数的起点开始执行
标准输入/输出库
调用函数时,只需要使用函数名加上用圆括号括起来的参数表即可
字符串或字符常量:用双引号括起来的字符序列
printf函数永远不会自动换行
所有变量必须先声明后使用,声明通常放在函数起始处
int通常为16位,取值范围在 − 32768 − − + 32767 -32768--+32767 −32768−−+32767之间
float通常为32位,至少有6位有效数字,取值范围在 1 0 − 38 — — 1 0 38 10^{-38}——10^{38} 10−38——1038之间
long至少要占用32位存储单元
整数除法操作将执行舍位,结果中的任何小数部分都会被舍弃
如果在printf语句的第一个参数的%d中指明打印宽度,如%3d,则打印的数字会在打印区域内右对齐
如果某个算术运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型
printf中的转换说明==%3.0f==表明待打印的浮点数至少占3个字符宽,且不带小数点和小数部分
for (a = 0; a <= 10; a = a + 1)
{
循环体;
};
第一部分
a = 0
是初始化部分,仅在进入循环前执行一次
第二部分
a <= 10
是控制循环的条件部分。如果结果为真,则执行循环体,然后执行第三部分;如果结果为假,则退出循环
第三部分
a = a + 1
将循环变量a增加1,再对条件求值
#define指令可以把符号名(符号常量)定义为一个特定的字符串:
#define 名字 替换文本
一次读/写一个字符的函数:getchar()和putchar()
getchar():
每次调用时,getchar函数从文本流中读入下一个输入字符,并将其作为结果值返回。
在执行语句
c = getchar();
之后,变量c中将包含输入流中的下一个字符
putchar():
每次调用时,putchar函数将打印一个字符。
在执行语句
putchar(c);
之后,将把整型变量c的内容以字符的形式打印出来,通常是显示在屏幕上
把输入一次一个字符地复制到输出,基本思想:
读一个字符
while(该字符不是文件结束指示符)
输出刚读入的字符
读下一个字符
c = getchar();
while((c=getchar()) != EOF){
putchar(c);
c=getchar();
}
如何区分文件中有效数据与输入结束符?
C语言方法:在没有输入时,getchar函数返回一个特殊值EOF(end of file)。
c声明为int而不是char的原因:
为了能存储任何可能的字符外,还要能存储文件结束符EOF
/*字符计数*/
long nc;
nc = 0;
while(getchar() != EOF)
++nc;
printf("%ld\n", nc);
改用for循环:
double nc;
for(nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
%.0f强制不打印小数点和小数部分
单独的分号称为空语句
/*行计数*/
int c, nl;
nl = 0;
while((c = getchar()) != EOF)
if(c == '\n')
++nl;
printf("%d\n", nl);
=表示赋值运算符,==表示相等的逻辑关系
单引号中的字符表示一个整型值,该值等于此字符在机器字符集中对应的数值,称之为字符常量
/* 统计输入的行数、单词数与字符数*/
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while((c = getchar()) != EOF){
++nc;//字符数
if(c == '\n')
++nl;//行数
if(c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if(state == OUT){
state = IN;
++nw;//单词数
}
}
数组下标总是从0开始的
函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑它是如何实现的
函数定义的一般形式:
返回值类型 函数名(0个或多个参数声明)
{
声明部分
语句序列
}
函数的参数使用的名字只在函数内部有效,对其他任何函数都是不可见的:其他函数可以使用与之相同的参数名字而不会引起冲突
形式参数:函数定义中圆括号内列表中出现的变量
实际参数:函数调用中与形式参数对应的值
函数不一定都有返回值。不带表达式的return语句将把控制权返回给调用者,但不返回值
main函数中包含return语句是为了注意:程序要向其执行环境返回状态
函数原型中的参数名是可选的
所有函数参数都是通过值传递的,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中,被调用函数不能直接修改主函数中变量的值,而只能修改其私有的临时副本的值
字符串常量,以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,并以’\0’标志字符串的结束
调用getline函数的程序无法预先知道输入行的长度,因此getline函数需要检查是否溢出
自动变量:函数中的每个局部变量只在函数被调用时存在,在函数执行完毕退出时消失
可以定义位于所有函数外部的变量,在所有函数中都可以通过变量名访问这种类型的变量,使用extern语句显式声明
外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元
某些情况下可以省略extern声明。在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没有必要使用extern声明
定义与声明的区别
定义:表示创建变量或分配存储单元
声明:指的是说明变量的性质,但并不分配存储单元
过度依赖外部变量会导致一定的风险,因为它会使程序中的数据关系模糊不清——外部变量的值可能会被意外地修改,而程序的修改又变得十分困难