文章目录
本篇内容总结了菜鸟教程-C语言中相关内容(https://www.runoob.com/cprogramming/c-basic-syntax.html),用以查阅自用。
一、函数:
函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
C 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
函数还有很多叫法,比如方法、子例程或程序,等等。
C 语言中的函数定义的一般形式如下:
return_type function_name( parameter list )
{
body of the function
}
在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
1.返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
2.函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
3.参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
4.函数主体:函数主体包含一组定义函数执行任务的语句。
举例:
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
二、数组:
在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:
double balance[10];
现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。
三、操作符:
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
算术运算符
关系运算符
逻辑运算符
位运算符
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
赋值运算符
杂项运算符
注意:
1.sizeof不是函数,而是一个操作符。
2.ex1?ex2:ex3表示:ex1为真,则执行ex2,否则执行ex3。举例:
int a = 0;
int b = 0;
b = (a == 1) ? 2 : 3;//如果a==1,则b=2,若a≠1,则b=3。此处b=3。
3.逗号运算符:从左到右依次执行,最后一步执行的结果为最终结果。举例:
int main()
{
int a, b, c, d,val;
a = 2;
val = (b = a - 2, c = b + 5, d = c - 2);//从左到右依次计算,将最后一次计算出的d的值赋给val = 3
printf("%d", val);
}
四、关键字:
关键字 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
关键字 static
在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
1.修饰局部变量
观察下面两段代码及其运行结果:
(一)
#include <stdio.h>
#include <string.h>
void test()
{
int a = 0;
a++;
printf("%d ",a);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
test();
}
(二)
#include <stdio.h>
#include <string.h>
void test()
{
static int a = 0;
a++;
printf("%d ",a);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
test();
}
综上我们发现,经过static修饰的局部变量,在出了作用域后没有销毁,其生命周期延长了,和全局变量一样。这说明,static改变了局部变量的存储类型。
图源B站鹏哥C语言。
2.修饰全局变量
当在其他.c文件中使用static声明变量后,我们发现,即使在主函数源文件中使用extern声明了该变量,该变量也无法使用,这表示经过static修饰的变量,只可以在本源文件(.c文件)中调用。
3.修饰函数
与上面static修饰全局变量一样,static修饰函数后,使得该函数具有内部连接属性,没有了外部链接属性,只能在本源文件(.c文件)中使用该函数。
关键字 extern
在实际使用中我们经常遇到这种情况:在其他源文件中定义了一个变量,但是需要在另一个源文件中使用,如何使得所有源文件中的该变量都是同一个变量呢?那么需要在主函数的源文件中使用extern来声明该变量,就可以使用了。对于其他源文件中的函数也是如此,也可以在主函数文件中extern声明该函数。
比如下面两个代码块表示两个.c文件:
//a.c文件
int g_val = 100;
//b.c文件
extern int g_val;
int main()
{
printf("%d", g_val);
}
五、定义宏:
#define定义宏时注意变量是不是要加括号。举例:
//宏定义示例:
#define ADD1(X,Y) X + Y
#define ADD2(X,Y) ((X) + (Y))
int main()
{
int a = 1;
int b = 2;
int sum1 = 4 * ADD1(a, b);//4*1+2=4+2=6
int sum2 = 4 * ADD2(a, b);//4*(1+2)=4*3=12
printf("%d %d", sum1, sum2);
}
两个宏是不一样的。