进一步使用C
以下是在C中如何使用C计算,运算符的引入使得这个过程变得简单
int main(void)
{
int feet, fathoms;
fathoms = 2;
feet = 6 * fathoms;
printf("There are %d feet in %d fathoms!\n", feet, fathoms);
printf("Yes, I said %d feet!\n", 6 * fathoms);
return 0;
}
多条声明
在这段文字中,我们首先声明了变量,然后为变量赋值,在使用函数时需要告诉程序我们要使用的变量。
这里声明变量有两种方式
int feet,fathoms;
int feet;
int fathoms;
个人更喜欢将能够看出意思的单词变量放在同一行,将需要解释意思的变量逐条、逐行列出
这里我对比了更改printf()中变量的声明顺序得到了以下结果
发现更改声明顺序后printf()打印的内容发生了改变由原本的“2feet、12fathoms”变为了“12feet、2fathoms”,也就是说%d提取变量的内容是根据我们在后方声明的顺序来决定的。
多个函数
#include <stdio.h>
void butler(void);//第一次调用butler()是作为 ANSI/ISO C函数原型
//告知编译器要使用该函数
int main(void)
{
printf("I will summon the butler function.\n");
butler();//第二次调用butler(),以函数调用(function call)的形式出现在main()
printf("Yes.Bring me some tea and writeaable DVDs.\n");
return 0;
}
void butler(void)//函数定义-函数定义是函数本身的源代码
{
printf("You rang, sir?\n");
}
函数原型是一种声明形式
- 告知编译器正在使用某函数,因此函数原型也被称为函数声明。
- 指明了函数的属性。例如:butler()函数原型中的第一个void表明,butler()中没有返回值1;第二个void的意思是butler()函数不带参数,这里的void的意思是“空的”,而不是“无效”
我进行了一些小实验
- 当我们不告知编译器我们要使用butler()函数时,它会报错。
- 当改变main()中的butler()的位置时,结尾void butler(void)的执行结果会体现在butler()当前位置上。
- 当屏蔽掉main()中的butler()再运行时,最后的结果将不会显示butler()的执行结果。
调试程序
这是一段错误的程序
#include <stdio.h>
int main(void)
(
int n, int n2, int n3;
/*该程序有多处错误
n = 5;
n2 = n * n;
n3 = n2 * n2;
printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3);
return 0;
)
它存在
- 语法错误
首先,左右花括号代表函数执行开始与结束,这里使用了圆括号
第二,声明变量的两种方式是int n, n2, n3
或者int n ; int n2; int n3;
第三,/*使用未接结束符 */,所以建议直接使用 // - 语义错误
n3 = n2 * n2
但是n3的原意是n的三次方,但是这里设置为了n的四次方,此类错误C编译器无法检测,所以会得出错误的结果而不知道原因。
- 程序状态——program state
- 自己模拟计算机逐步执行程序:
以n3 = n2 * n2
为例,我们设置三个标记为n、n2、n3的空白方块,给第一个方块赋值5,执行第一步n2 = n * n
得到25;然后执行第二步n3 = n2 * n2
得到625,发现语义错误。
这种方式适合在大量数据中跟踪一小部分循环看其是否根据预期运行。 - 在程序的关键点插入额外的printf()语句:
监视指定变量值的变化,通过查看变量值的变化可以了解情况,在确认无误后屏蔽该语句。 - 调试器——debugger
它可以使你一步步运行程序,并检查程序变量的值,类似于visual studio就有自带调试器。
关键字和保留标识符
关键字是C语言的词汇,它们对于C语言比较特殊,不能作为标识符。
许多关键字用于指定不同类型或控制程序中语句的执行顺序。
当关键字使用不当时,编译器将会视为语法错误。
关键概念
编程的魅力在于当你是正确的时候,计算机一定会给你正确的结果,但是你几乎正确时,结果仍然是错误的。
通常被调函数会像主调函数返回一个值,但是butler()函数没有 ↩︎