变量
C语言中变量有局部变量和全局变量。
全局变量
在函数外面定义的变量称为外部变量,也称为全局变量。它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。不过需要注意的是,在其他.c文件中使用需要用extern来声明。
hehe.c文件中 int Global_variable; main.c文件中使用Global_variable extern int Global_variable; int main() { }
局部变量
定义在函数内部的变量称为局部变量,它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
int main() { int Local_variable; //Local_variable仅在函数main()内有效 return 0; }
全局变量和局部变量同名
若在函数的内部存在一个与全局变量同名的局部变量,编译器不会报错,而是局部变量优先使用。
#include <stdio.h> int global = 2019;//全局变量 int main() { int local = 2018;//局部变量 int global = 2020;//局部变量 printf("global = %d\n", global); return 0; }
最后这个代码打印出来的是
表明与全局变量同名的局部变量,是局部变量优先使用。
变量的创建与赋值
当我们创建了一个变量的时候,可以进行赋值初始化,也可以不进行初始化。
注意:
1,在许多编译器中,如果变量在创建的时候没有初始化,编译器会自动给该变量赋值为0。但是有一部分编译器,如果创建了变量没有初始化,之后也没有赋值使用会进行报错。
2,如果两个变量都是同一类型,可以写在同一行同时创建。
//分开创建变量 int a=1; //创建了变量a,并且在a中赋值为0 int b; //创建了变量b,没有赋值 //放在同一行创建变量,注意中间有一个英文的逗号 int a = 1, b; int b, a = 1; //三种写法都可以 int main() { int a = 1, b; printf("a= %d b=%d \n", a, b); //注意,有些编译器会报错,说b没有被赋值,但是有些又可以。 return 0; }
变量使用
这里就是利用scanf函数,让我们利用电脑键盘输入数据给这个变量。
#include <stdio.h> int main() { int num1 = 0; int num2 = 0; float num3 = 0; char num4 = '0'; char num5[10] = {0}; printf("输入两个操作数:>"); scanf("%d %d",&num1,&num2); printf("sum1 = %d sum2 = %d\n", num1,num2); printf("一个浮点数据:>"); scanf("%f",&num3); printf("sum3 = %f",num3); getchar(); printf("\n"); printf("一个字符:>"); scanf("%c", &num4); printf("sum4 = %c", num4); getchar(); printf("\n"); printf("一个字符串:>"); scanf("%s", num5); printf("sum5 = %s", num5); return 0; }
输出结果
注意:
1,这里是int型数据,所以用%d,如果是float型数据用%f,char型数据用%c,字符串用%s
2,num5那个地方没有使用&。是因为num5是一个数组,而单独的num5表示数组的首地址,是一个指针。后面会讲。
常量
字面常量
字面常量就算直接写出来的固定值,他分为整型常量和字符常量。
int main() { //字面常量演示 3.14;//字面常量 1000;//字面常量 }
const 修饰的常变量
当有const修饰的变量,他的值是无法被改变的。
int main() { const float pai = 3.14; //这里的pai是const修饰的常变量 const float pa; //这里的pai是const修饰的常变量,若不初始化,变量将永远没有机会拥有状态。 //pai++; //pai = 5.14;//是不能直接修改的! return 0; }
这里有一个要注意的点,const修饰的常变量必须初始化(就是赋值pai=3.14)。否则他永远不可能拥有数值。
这个时候有人会有疑惑,既然const修饰的常变量无法被更改,有什么用呢?打个比方,我们现在创建了两个变量,一个是pai,另外一个是pa。我们要利用pai求圆面积。因为工程中有两个变量,如果不小心把pa打成了pai,然后将其改变了数值。那样会导致求出来的圆面积有问题。
这个时候就又会问了,那我不把第二个变量做成pa不久可以了吗?因为大规模工程中有很多变量,我们时常是直接复制粘贴的,有时候我们复制粘贴错了,但是有没有注意到也是有可能的。这样也会导致出现问题。加上const之后,系统会帮助我们检查。
#define 定义的标识符常量
#define(宏定义),宏定义是非常有用的一个句子,作为一名嵌入式工程师,写程序的时候一定会大量的使用宏定义。因为有了宏定义之后,我们进行移植就会非常简单。看下面代码
#include <stdio.h> #define MAX 100 int main() { printf("max = %d\n", MAX); return 0; }
这里我们将MAX宏定义了,现在MAX代表100,代码中每次出现MAX,系统都会认为MAX就是100。如果我们每次想打印一个数值,只需要在最上面#define后的数即可。
注意:#define之后不能加上;。因为#define x y 就是把x完完全全等效成y。如果加上了;,那么就相当于直接在程序中加了;
#include <stdio.h> #define MAX 100;//错误!!! int main() { printf("max = %d\n", MAX); return 0; }
枚举常量
#include <stdio.h> enum Sex { MALE, FEMALE, SECRET }; int main() { printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n", SECRET); return 0; }
枚举常量需要注意的地方:
1,不可以对对枚举变量赋值,只能将它们的值赋给其他变量。
2,不能在定义与枚举常量相同名字的变量
3,不能用&取得他们的地址
注释
注释,意思就是编译器不会编译,作用就是作为给程序员的一种提示或者提醒。因为很多时候,我们现需要接手别人的代码,当别人在自己的代码上写上注释,方便他人快速理解。C语言中有两种注释,一种为//,另外一种为/**/
//详解
//就是把他同一行的后面所有东西给注释掉。
//这里被注释了 这里没有被注释 这里没有被注释 //这里被注释了
/**/详解
/*内容*/,就是把/**/所包含的所有内容给注释掉。/*会寻找最近的*/进行匹配。
/*这里被注释了 这里被注释了 这里被注释了 这里被注释了*/ /*这里被注释了 这里被注释了 这里被注释了*/ 这里没有被注释*/