分类: C/C++
2009-08-26 11:07:51
C语言源程序由一系列的单语句、复合语句、预处理语句和注释语句组成。复合语句由若干条简单语句组成,并用花括号括起来。每一条简单语句后均由单词及运算符组成,并以“;”结束。
单词是指由字母、数字及下划线组成的字符串,单词必须以字母或者下划线开始。
C语言的运算符具由优先级和结合性。优先级指运算时哪一个运算符会被优先计算。结合性是指对相同优先级的运算符,左边或者右边的子表达式将被优先计算。C语言运算符的优先级与结合性见表3-1所示。
表3
运 算 符 |
结 合 性 |
() [] -> . |
从左至右 |
++ -- + - ! ~ (类型) * & sizeof |
从右至左 |
* / % |
从左至右 |
+ - |
从左至右 |
<< >> |
从左至右 |
<<= >>= |
从左至右 |
== != |
从左至右 |
& |
从左至右 |
^ |
从左至右 |
| |
从左至右 |
&& |
从左至右 |
|| |
从左至右 |
?: |
从右至左 |
= += -= *= /= %= &= ^= != <<= >>= |
从右至左 |
, |
从左至右 |
注:运算符从上至下按优先级降序排列
☆ 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语句处。
☆ while (condition) { ...}:若condition为真,则执行循环体内的语句,否则结束循环。
☆ do {...} while (condition):执行循环体内的语句,并根据condition的真假决定继续循环或者结束循环。
☆ for ( init; condition; calculation) {… }:首先执行init表达式,然后判断condition,若其为假,则不结束循环。若condition为真,则执行循环体,然后做计算calculation。计算之后再判断condition的真假,并决定继续循环或者结束循环。
☆ continue:结束本次循环,并继续下一次循环。对for循环,将先做计算calculation。
☆ break:结束整个循环体。结for循环,将不再计算calculation。
☆ 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()
{
int x = 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()
{
int x = 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 */