同学习其他语言相比,学习C语言给我的第一感觉是很难,所以打算在这里记录自己的学习之旅。
在C语言程序的程序,主要包含以下三个部分:
C语言与Matlab和Python有很多不同之处,其中最大的不同之处在于C语言需要自己去定义变量的类型,例如:
#include
int main()
{
int a = 3;
return 0;
}
这里的a不能直接定义为
#include
int main()
{
a = 3;
return 0;
}
而这在Matlab和Python里是可以的。
所以接下来记录一下变量的类型。
在C语言中,变量的类型主要包括字符型,短整型,长整型,整形,单精度浮点型,双精度浮点型,嗯…好像就这么多了,不知道漏了没。
字符型的变量在计算机内存所占内存的大小是1个字节,短整型是2个字节,整型变量是4个字节,长整型可以是4个,也有的编译器是8个,对于C语言的国际标准来说,只要大于整型变量的长度的变量就是长整型,单精度浮点数是4个,双精度是8个。注意,这里的一个字节表示8个bit位,也就是说一个字节可以保存8位二进制数,例如可以保存1111 1111。
下面我将在编译器里验证
# include
int main()
{
printf("字符型变量:%zd\n", sizeof(char));
printf("短整型变量: %zd\n", sizeof(short int));
printf("长整型变量:%zd\n", sizeof(long int));
printf("整型变量:%zd\n",sizeof(int));
printf("单精度浮点型变量:%zd\n",sizeof(float));
printf("双精度浮点型变量:%zd\n", sizeof(double));
return 0;
}
这里还涉及到全局变量和局部变量,这和其他语言中的类似,在C语言中全局变量就是在函数之外(包含main()函数),局部变量指的是在函数里面,只能在对应的函数里面使用,这就引出了一个变量的作用域和生命周期。所谓作用域即是变量的使用范围或者领域,生命周期指的是一旦变量不能在相应的部分使用,就说明它的生命周期已经在这个部分结束。
# include
int main()
{
int i = 0;
for (i; i < 5; i++)
{
printf("循环次数:%d\n", i);
}
return 0;
}
# include
int main()
{
int i = 0;
while(i < 5)
{
printf("循环次数:%d\n", i);
i++;
}
return 0;
}
运行结果和for循环一样,此处就不展示结果了。
#include
int main()
{
int a;
printf("请输入一个数字:\n");
while (1)
{
scanf("%d", &a);
switch (a) {
case 1: printf("a输入为:%d\n", a);
case 2: printf("a输入为:%d\n", a);
}
}
return 0;
}
指针变量是用来存放变量地址的变量,例如将房子(这个房子是有门牌号的)这这个变量赋予一个值,假设这个值为人。那么门牌号就相当于指针变量,是一个地址。通过这个地址可以找到这个人(也就是这个值)。例子如下:
int main()
{
int a = 0;
int* p = &a; //p是一个指针变量,所占空间为4个字节(编译器是32位)
printf("%d\n", a);
printf("%d\n", *p);//*p是解引用操作,是把p里面存的地址的变量找出来
*p = 1;
printf("%d\n", a); //a的值是可以通过对地址的解引用操作之后,直接将新的值放到原有的地址下面
//int a = 1; //而这种情况不对的,不能对a再次初始化,正确编译的话,需要把该行去掉
return 0;
}
这里就举一个构建结构体的例子,这里的BOOK,我现阶段的理解就是相当于一个类的名称,这个类里面有两个属性,分别位一个字符串型变量Name,长度为20个字节,另外一个是整型变量Price。“struct BOOK b1 = {“C语言程序设计”, 55}” 这句话是将具体的值赋给抽象的变量名称,我感觉这里就是实例化对象。
由于这里的书名是字符型的数组,而数组实质上是一个地址,这里修改书名只能利用strcpy进行修改,这里不能直接修改的原因仅仅是因为书名是个数组。比如这里的Price就可以直接通过pc变量的解引用操作而改变为15。
#include
struct BOOK
{
char Name[20];
int Price;
};
int main()
{
struct BOOK b1 = {"C语言程序设计", 55};
struct BOOK* pc = &b1;
printf("地址操作:%s\n",(*pc).Name);
printf("原始操作:%s\n", b1.Name);
printf("操作符:%s\n", pc->Name);
printf("地址操作:%d\n", (*pc).Price);
printf("原始操作:%d\n", b1.Price);
printf("操作符:%d\n", pc->Price);
strcpy((*pc).Name, "C++");
printf("%s\n", pc->Name);
(*pc).Price = 15;
printf("%d\n", pc->Price);
return 0;
}
比如+,-,!等
有按位与&,按位或|,与&&,或||,左移位操作符<<,右移位操作符>>,注意移位操作符是将整个二进制数移动,异或(相同为0,相异为1)。
(a>b?a:b)
例子如下:
#include
int main()
{
int a = 10, b = 20;
int c = (a > b ? a : b);
printf("%d\n", c);
return 0;
}
最后还有一些零碎的点,比如extern是用来声明外部的函数和变量,static是用来修饰静态变量的,它能保证局部变量不被销毁,延用语句结束时的值,还有创建枚举常量的enum,代码如下:
利用extern调用函数:
#define _CRT_SECURE_NO_WARNINGS
#include
extern ADD(x, y);
int main()
{
int a = 10, b = 20, c = 0;
c = ADD(a, b);
printf("%d\n", c);
}
包含ADD函数的另外一个.c文件如下:
#define _CRT_SECURE_NO_WARNINGS
int g = 10;
int ADD(int x, int y)
{
int Sum = x + y;
return Sum;
}
枚举常量的用法如下:
#define _CRT_SECURE_NO_WARNINGS
#include
enum Color
{
Yollow,
RED,
GREEN
};
int main()
{
printf("%d\n%d\n%d\n", Yollow, RED, GREEN); //打印出来的结果是0 1 2
}