命名规则及运算符
C语言源程序由一系列的单语句、复合语句、预处理语句和注释语句组成。复合语句由若干条简单语句组成,并用花括号括起来。每一条简单语句后均由单词及运算符组成,并以“;”结束。
单词是指由字母、数字及下划线组成的字符串,单词必须以字母或者下划线开始。
C语言的运算符具由优先级和结合性。优先级指运算时哪一个运算符会被优先计算。结合性是指对相同优先级的运算符,左边或者右边的子表达式将被优先计算。C语言运算符的优先级与结合性见表3-1所示。
表3-1C语言运算符的优先级与结合性
运算符
结 合 性
()[]->.
从左至右
++--+-!~ (类型)*& sizeof
从右至左
*/%
从左至右
+-
从左至右
<<>>
从左至右
<<=>>=
从左至右
==!=
从左至右
&
从左至右
^
从左至右
|
从左至右
&&
从左至右
||
从左至右
?:
从右至左
=+=-=*=/=%=&=^=!=<<=
>>=
从右至左
,
从左至右
注:运算符从上至下按优先级降序排列
流程控制
3.2.1选择及分支
☆if(condition) { for-true} else {for-false}:如果condition为真(非0),则执行语句for-true,否则执行语句for-false。例如,如果姓名及密码合法,则显示欢迎,否则显示不欢迎:
if ( strcmp (user,“guest”) == 0 && strcmp (password,“guest”) == 0)
{
printf (“hello: %s\n”, user);
}
else
{
printf (“Stop! You are not trusty!\n”);
exit (1);
}
☆switch(expression) {case (value):…break;…}:switch语句提供多重选择,expression为整型变量,value为整型常量(字符型可看作整型)。程序进入到与expression匹配的分支,并运行到整个switch语句的末尾或者第一个break语句处。
3.2.2循环
☆while (condition) { ...}:若condition为真,则执行循环体内的语句,否则结束循环。
☆do {...} while (condition):执行循环体内的语句,并根据condition的真假决定继续循环或者结束循环。
☆for ( init; condition; calculation) {…}:首先执行init表达式,然后判断condition,若其为假,则不结束循环。若condition为真,则执行循环体,然后做计算calculation。计算之后再判断condition的真假,并决定继续循环或者结束循环。
☆continue:结束本次循环,并继续下一次循环。对for循环,将先做计算calculation。
☆break:结束整个循环体。结for循环,将不再计算calculation。
3.2.3跳转
☆goto label:无条件跳转到label指定的标号处。该语句的大量使用将会严重破坏程序的结构,建议尽量少用。
☆return:从函数体返回。
☆exit:退出当前进程。
函数
函数是实现结构化程序设计的有力工具。函数的普遍形式为:
type foo (type arg1, type arg2,…)
其中:type指出函数返回值或者参数的类型
有的系统要求函数使用前必须定义,可以在使用某函数前申明该函数的原型。更普遍的做法是统一将程序中用到的函数原形申明在头文件中,每一个程序均包含该头文件。
C语言的函数参数通常是传值的。如下列函数调用:
void fun(int x, int y)
{
x++, y++;
printf(“IN fun(): x[%d], y[%d]\n”, x, y);
}
void caller()
{
intx = 5, y = 7;
printf(“IN caller(1): x[%d], y[%d]\n”, x, y);
fun(x, y);
printf(“IN caller(2): x[%d], y[%d]\n”, x, y);
}
为了在被调用函数中改变传入参数的值,必须以地址作为参数,例如:
void fun(int *x, int *y)
{
*x++, *y++;
printf(“IN fun(): x[%d], y[%d]\n”, *x, *y);
}
void caller()
{
intx = 5, y = 7;
printf(“IN caller(1): x[%d], y[%d]\n”, x, y);
fun(&x, &y);
printf(“IN caller(2): x[%d], y[%d]\n”, x, y);
}
同样,如果传入的参数本身就是指针型变量,为了改变该指针指向的地址,必须传入二级指针。例如:
void fun(int **x)
{
*x = malloc(sizeof(int));/* allocate memory */
**x = 5;/* set value */
printf(“IN fun(): x[%d]\n”, **x);
}
void caller()
{
int*x = NULL;
fun(&x);
printf(“IN caller(2): x[%d]\n”, *x);
free(x);/* free memory */}