变量:
在C中,变量包含内存位置。程序可以通过变量的名称,访问这个变量的值。赋值的过程,就是修改内存单元存储数据的过程。
例如,我们使用 int a = 1;,进行赋值。其中a在内存中,有一个自己的地址,我们假设这个地址为2010,在2010这个内存单元里面值是1。a的内存地址是2010,这个2010 跟 1 的关系,类似于你家住址和你的关系。了解这个就是了解指针的基础。
命名变量:
1.名称可以包含字母,数字和_.
2.名称开头只能是字母或者是_
3.大小写敏感,Test.c 跟 test.c不是一个文件。
4.名称不能使用关键字。
5.不要使用_X 或者__作为变量名称,因为这都是系统库使用的变量名称。X为大写字母 另外,为了便于阅读代码,请使用有意义的变量名称进行定义
声明变量
data_type name_of_variable;
为什么要使用date_type?C语言是个强类型语言,我们在使用变量的时候必须要添加类型,关键是由于:C的编译器可以通过类型,对这个变量分配相对应的内存,这就可以节省更多的内存空间。
int a;
int b;
int c;
=> int a,b,c;
计算数值时,如果你再float和double类型中徘徊的时候,我建议你使用double。
当然你不在意精度的话,请使用float类型,使用float类型时,计算速度会很快,分配的内存也相对少些。但是也会带来很多让你非常难以debug的错误。
int main(void)
{
float a = 3.1;
if (a == 3.1)
printf("Yes\n");
else
printf("No\n");
printf("%.9f\n",a - 3.1);
return 0;
}
如果定义a为float类型,那么结果是:
No
-0.000000095
如果定义为double类型,结果是:
Yes
0.000000000
复杂的变量定义
static const unsigned int a;
相对static变量定义,缺省的变量类似是auto类型,剩下的还有extern和register,一共是4种。
我们回头再说这些,暂时只要知道这些关键字都是和寄存器相关即可
另外const这个关键字,其实意思就是read-only,只读。
自动转换问题
int main(void)
{
int i = 6;
double j = i/4;
printf("The j is %f\n",j);
}
运算结果为:
1.000000
实际上,由于i/4,i属于int,4 也是int,i/4得到一个int类型的数值 1。然后将1转变成double类型 1.000000。如果想得到更精确的结果,请讲4,写成4.0
另外就是char与int类型转换问题,由于ASCII码的范围是0-255,所以char的变量,在int表示就只能在这个范围内,int ch,这个变量ch,只能在0-255之前赋值。
#include <stdio.h>
int main(void)
{
int ch = 65;
printf("The ch is %c\n",ch);
}
结果:
The ch is A
#include <stdio.h>
int main(void)
{
int a = -20;
unsigned int b = 200;
if(a < b)
printf("Yes\n");
else
printf("No\n");
return 0;
}
结果:
No
因为在做比较时,int 会先转变成unsigned int,然后再做对比。但是-20转变成无符号整数时,这时a = 2^32 - 20, 自然a > b
还有类似以下的强制转换:
int a = (int)1.99 * 10
结果为:10
类型限定
const 就是只读类型,既然是只读,我们无法在程序其他位置为其赋值,所以只能在声明的时候就对其进行赋值。
const int a = 10
作为限定符的volatile,用的相对少很多。这个关键字的作用是通知编译器,这个变量可能会改变,即便它在程序中似乎没有被修改。
int flag = 0;
while(flag != 100)
{
...
}
这个循环似乎是个死循环,然而flag可以被隐式修改,所以我们可以定义flag为:
volatile int flag = 0 ;
define标识符
#define macro_name value
其实这个不是变量,只是一个宏。也就是说在编译器编译前,会有以一个预编译过程,这个过程会将之前定义的macro_name 用 value进行一个替换而已。这macro_name 也不会被分配内存空间
不过通过这种方式,我们会很方便的进行设置一些常量,并方便进行修改。
关于宏定义,将来还会拿出来学习一下的。