基本的C语言语法知识
// 这是我的第一个C语言代码
#include
int main() // 这是主函数
{
printf("Hello World\n"); // 写第一行字Hello World
printf("Welcome to CPL World\n"); // 写第二行字Welcome to CPL World
return 0; // 主函数返回值
}
相信你已经看到了第一个示例代码的效果了,很简单就是在屏幕上输出了两行字符。一行是"Hello World",第二行是"Welcome to CPL World"。我们借此了解一下C语言的一些基本知识。
1. 主函数
首先是主函数main,一个标准的主函数长这样。
int main() // 这是主函数
{
return 0; // 主函数返回值
}
TIPS:
main是主要的; 最重要的意思。
双斜杠//: 双斜杠后面的为注释,注释就是写给其他人看的。比如写给你的同事,解释你这里为什么会这样写。注释不会被当做代码被编译。
2. 什么是函数
接下来呢,我们先谈谈什么是函数。函数是下面这样的吗?
正态函数
是的,但是这是数学里面的函数,编程语言里面的函数和这个可有很大的不同。在编程语言里面,你可以把函数看做一个盒子,这个盒子有怎么几个特性:
程序可以给函数输入一些东西(值)
函数本身可以做一些东西
函数可以返回给程序一些东西(值)
函数1
让我们看看我们的这个主函数,在这3个特性上,分别做了什么。
函数2
主函数什么都没有输入
主函数打印了两行字到屏幕上
主函数返回了0
函数3
这样是不是就清晰了呢?其中,int表明了函数的返回值类型,int是integer(整数)的缩写。main是函数名,main后面的()是输入参数,为空。return后跟函数的返回值,为0。而0是一个整数,是int,和函数名前面的int对应。
翻译:
integer是整数。
return是返回。
int是integer的缩写,它表示整数类型,简称整型。
我们总结一下函数的写法公式。
函数返回值类型 函数名(函数输入参数值)
{
return 函数返回值;
}
3. 写一个自己的函数
例如我们写一个整数加法函数,函数名叫add,输入两个整数,返回它们的和。
int add(int a, int b) // 这一段代码被称之为add函数的函数定义
{
return a+b;
}
函数4
好的,那我们写完了一个add函数了。这一段代码被称之为add函数的函数定义。
那我们需要怎样来使用它呢?add函数能直接运行嘛?答案是不行的,所有的C语言代码都有一个入口,这个入口就是主函数main。我们必须用主函数来调用add这个函数。
这个过程我们叫做函数调用。
这里也意味着,每个C语言代码,只能有且只有一个main函数。main函数必须要有,否则谁来开始一切。main函数只能有一个,否则运行哪个main的代码?
#include
int add(int a, int b)
{
return a+b;
}
int main()
{
int result;
result = add(2, 3);
printf("%d", result);
return 0;
}
这样main执行的时候,就会执行我们编写的add函数了。我们传了2个参数给add,注意哦,函数的定义中规定传2个参数,我们调用的时候,也必须传2个,并且类型也需要一致,否则编译会报错的。
我们暂时不讨论函数声明和定义的区别,避免引入过多的概念,不利于初学者理解。因此,请将暂时将函数声明放到函数调用的前面。
函数定义放在函数调用前
函数调用放在函数定义前
你可以这么理解,在调用到这个函数的时候,我必须知道add这个东西是一个函数,它可以被我调用,万一add是一个其他东西呢?你即没有定义,也没有声明(函数声明的概念暂时不引入)。那么编译器不知道add是个什么东西。所以编译会报错。因此,请将函数定义放到函数调用前。(暂时)
那么自然地,我们会想到,主函数是被谁调用的?主函数的返回值必须是int吗?
主函数在程序开始的时候被自动调用,因此,主函数是整个程序的入口。
主函数的返回值会返回给调用这个程序的应用,标准规定主函数有返回值且必须是int。
4. 变量
另外,我们需要有一个东西来接受add返回出来的值呀。所以,我们在add前面定义了一个int整型变量。什么是变量呢?就是可以变的量啊。它就是一个空箱子,里面可以装任何其他的和它类型一致的值。result只是我们给它起的一个名字,当然,你可以任意起名,比如叫he,叫xiangzi,都可以。我们把add返回回来的5,装进了result。因此,result的值是5了。
=等号,是赋值号,相信你已经发现它有把某一个值装进变量的功能了。和函数一样,这里的=号和数学里面的等号,也是有很大不同的。这里的=是赋值号,不是相等的意思。
赋值号,是能将=号右边的值,装进左边的变量的一种符号。
下图就是add函数接受2,3为输入,返回5,被赋值号=赋值给result的流程了。
函数5
5. #include和printf
最后呢,我们把result,值为5,给了另外一个函数,这个函数叫做printf,最终这个函数会把5打印到屏幕上。这里你肯定有点疑惑?为什么我们写HelloWorld的时候只传了1个参数给printf,现在却能传2个给它呢?不是函数的定义时的参数个数和类型需要和函数调用时候的保持一致吗?另外,这个printf函数是谁定义的呢?对的,你注意到了。
函数6
实际上,printf函数并不是我们定义的函数,而是系统自带的函数。这个函数被写在文件stdio.h中,我们要使用printf就必须把它的代码复制到我们的代码里面来。用#include命令,可以做到这一点。printf是一个很特别的函数,它是一个变参函数,所以可以接受可变数量和类型的输入参数。这里我们无需太过关心,暂时只需要使用它即可。
TIPS:
stdio.h里面并未定义printf函数,但是它里面有printf函数的函数声明。但是,在当前阶段里面,你可以理解为stdio.h里面,写了printf的函数定义。
我们来简要讨论一下printf函数,先看以下几个示例。
用于打印一个整数:printf("%d", 整型);
printf("%d", 12345);
用于打印两个整数:printf("%d\n%d\n", 整型1, 整型2);
\n表示换行,就是从下一行开始再继续打印
printf("%d\n%d\n", 123, 456);
用于打印一串字符:printf("%s\n", "字符字符字符");
printf("%s\n", "HelloWorld");
d表示整型,s表示字符串。如你所见,字符串必须被双引号包括。这也是为什么我们在开头的示例helloworld中,那两行英文字符串,被双引号包括的原因了。
printf("%s\n", "HelloWorld"); 正确
printf("%s\n", HelloWorld); 错误,编译器会认为HelloWorld是一个变量,但是这个变量又没有被定义。
printf1
我们来总结一下printf的公式
printf("XXX占位1 XXX 占位2 XXX占位3", 替换1, 替换2, 替换3);
printf的第一个参数必须是字符串(被双引号包括)。其中,占位用【%+类型】表示。例如整型的占位为%d。字符串的占位为%s。后面的替换参数,会依次替换前面的占位。printf是一个变长参数函数,只要第一个字符串参数占位符写对了,后面你可以加任意多的替换。
printf1
6. 语句
上面的代码中,被包括在函数{}中的代码被称为语句。语句请用封号;结尾。注意#include不是语句,它是预处理命令。所以不需要封号结尾。
TIPS:
请格外注意,C语言中的符号都是英文符号。请将输入法切换为英文,再输入符号。中文符号和英文符号是有差别的。
中文符号封号;
英文符号封号;
中文符号括号()
英文符号括号()
中文符号双引号“”
英文符号双引号""
它们是不同的