C语言详解:初始C语言1
闲话少说,先上思维导图。
如图所示,现在还是初识C语言的第一部分,本次只介绍了C语言本身特点,数据类型,常量变量,字符串转义字符注释,选择循环语句,函数,数组。
接下来请和我一起粗略地探讨其中内涵所在。
C语言本身特点
这是C语言的定义:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
但总结其特点就是1.底层开发,2.国际标准 ANSI C,3.面向过程
#include <stdio.h>
//stdio-标准输入输出 standard input & output headfile
//int -整型-整数的类型
//主函数
//main函数是程序的入口
//唯一性有且仅有一个
int main()
{
//库函数-打印函数-输出函数
printf("hello world!\n");
printf("hello world!\n");
printf("hello world!\n");
return 0;
}
//这种写法明确告诉你,main函数不需要传参
int main(void)
{
}
//这种写法有用,但不是重点
int mian(int argc, char* argv[])
{
}
数据类型
C语言主要有六种数据类型,分别为字符型char,短整型short,整形int,长整型long,单精度浮点型float以及双精度浮点型double。
这六种分别有自己的字符长度即其所建变量所占的空间,char最小只要1个字节,short占2个,int占4个,long一般是4个,也有可能是8个,反正只要满足long的字节长度大于等于int就可以了。两个浮点型的最为特殊,分别是4和8,显然双精度的精度更高。
int main()
{
//如何计算一个类型创建的变量所占空间的大小
//sizeof();
printf("%d\n", sizeof(char));//1个字节
printf("%d\n", sizeof(short));//2个字节
printf("%d\n", sizeof(int));//4个字节
printf("%d\n", sizeof(long));//4个字节
printf("%d\n", sizeof(long long));//8个字节
printf("%d\n", sizeof(float));//4个字节
printf("%d\n", sizeof(double));//8个字节
return 0;
}
常量变量
变量分类
显而易见的是,分为两类变量和常量讲述。变量又分两类,一是局部变量,二是全局变量。
顾名思义,局部变量是定义在一对大括号内的,显然我们平时在main函数里创建的都是局部变量,全局变量则为定义在大括号外面的变量。当二者同名时,局部变量优先,当然,这种代码谁写谁SB。
使用小建议
在程序中使用scanf函数,若程序为scanf("%d%d");%d%d之间不管有没有空格,输入变量时都要用空格隔开,若二者之间有逗号则逗号隔开。
生命周期作用域
对这二者讨论他们的作用域和生命周期的话,全局变量的作用域为整个工程文件,若想在其他.c文件中使用则需要extern声明一下,生命周期呢,则是整个工程的生命周期,也就是main函数的生命周期。局部变量的作用域为其定义的大括号{ }内,进作用域生命开始,出则结束。
//验证局部变量的作用域
int main()
{
int b = 100;//主函数任意位置
{
int a = 10;//局部变量作用域:局部所在范围
printf("a=%d\n", a);
printf("b=%d\n", b);
}
//printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
//验证全局变量的作用域为整个工程
int a = 200;
void test()
{
printf("test:%d\n", a);
}
int main()
{
test();
printf("main:%d\n", a);//全局变量可以任意使用
return 0;
}
//全局变量在其他源文件的使用
//转到test1.c文件查看
int g_val = 110;
//验证局部变量的生命周期为进作用域到出作用域
int main()
{
{
int a = 100;
printf("%d\n", a);
}
printf("%d\n", a);//出作用域即生命周期结束
return 0;
}
//全局变量的生命周期为整个工程即main函数生命周期
int main()
{
printf("%d\n", g_val);
return 0;
}
常量分类及其特点
常量呢,大致分为四种,1字面常量,2const修饰的常变量,3#define定义的标识符常量,4枚举常量。
第一种,字面常量就是随便写出来的一个数,如3.14就是一个字面常量。
第二种,const修饰的常变量,即在创建变量时加上const修饰,如const int a=0;这样变量a就具有了常属性,不可被修改。但值得注意的是,常变量一词,它仍然是个变量,不可用于定义数组。
//const修饰的变量
int main()
{
//局部变量
int a = 200;
//不可被改变的属性,常属性
const int a = 110;
a = 100;
printf("%d\n", a);
//const修饰的变量不可定义数组
//(常变量)
int n = 110;
int arr[n] = { 0 };//数组
return 0;
}
第三种,#define定义的常量,写法如 #define N 10,这是真真正正的常量,可以用来定义数组。同样也是不可修改的(常量当然不可被修改)。
#define PAI 314
int main()
{
int a = PAI;
printf("a=%d\n", a);
//MAX = 300;//#define定义的变量不可被修改
//可用于定义数组
int arr[PAI] = { 0 };
return 0;
}
第四种,枚举常量,具体使用方法像enum sex {MALE,FEMALE,SECRET};这样就得到了枚举常量,各自都是有初值的,分别为0,1,2依次类推,当然也可以自己赋值。
//枚举常量 SEX性别举例
//可以一一列举的值,性别,三原色
enum Sex
{
//枚举的可能取值
MALE=3,//赋初值
FEMALE=8,
SECRET//向后延一个为9
};
int main()
{
//FEMALE = 99;//ERR 枚举变量值不可修改
enum Sex a=MALE;
enum Sex s = FEMALE;
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
字符串+转义字符+注释
字符串
被单引号引起来的,如'w','r'是字符,被双引号引起来的"yyx","abcdef"是字符串。字符串一般以'\0'结尾隐含在字符串的末尾。既然'\0'为字符串结束标志,在计算字符串长度时当然不算作字符串内容。
//字符,字符串
int main()
{
//'a', ' ' , 'X' - 字符
//"abc" "123" - 字符串
//"abcdef"; //字符串字面值
//①
char ch1[] = "abcdef";//初始化字符数组
//a ,b ,c ,d ,e ,f ,\0
//%s - 打印字符串
//strlen - 打印字符串长度,(遇\0则停止,本身不算)\0是字符串结束标志
printf("%s\n", ch1);
//abcdef
printf("%d\n", strlen(ch1));//6
//②
char ch2[] = { 'a','b','c','d','e','f' };
//a ,b ,c ,e ,f
printf("%s\n", ch2);
//abcdef烫烫烫烫烫abcdef
printf("%d\n", strlen(ch2));//22,找不到\0
//③
char ch3[] = { 'a','b','c','d','e','f','\0' };
//a ,b ,c ,d ,e ,f ,\0
printf("%s\n", ch3);
//abcdef
printf("%d\n", strlen(ch3));//6
return 0;
}
转义字符
有防止单引号,双引号,反斜杠被转移的' \' ' , ' \" ',' \\ ' 。警告,蜂鸣的' \a ' ,退格符' \b ',进纸符' \f ',换行符' \n ',回车符' \r ',水平制表符' \t ',垂直制表位' \v ',八进制数字' \ddd ',十六进制数字' \xdd ' 。
#include <stdio.h>
int main()
{
printf("c:\code\test.c\n");//c:code est.c
printf("c:\\code\test.c\n");//c:\code est.c
//单个\是转义序列符,但这里又没有\c的转义字符,所以系统自动忽略该\
//想要出现该\,则必须要搭配两个\\,防止其被转义
return 0;
}
// \?
//三字母词
// ??) --> ] ??( --> [
//\' \"
int main()
{
printf("%c\n", 'a');
printf("%c\n", 'b');
printf("%c\n",'\'');//在’前面加上\,以单纯的将其视为字符'
printf("%s\n", "\"");// \"
return 0;
}
//\a \b \f \v \t \n \r
//\ddd八进制数字 \xdd十六进制数字
int main()
{
printf("%c\n", '\165');
//打印八进制数字065转化为十进制数字53所代表的字符(ASCII码)
printf("%d\n", '\165');
//打印八进制数字065转化为十进制数字53
printf("%c\n", '\x15');
printf("%d\n", '\x15');//21
return 0;
}
两种注释
C++的风格 //xxxxx ,这种只能注释一行。C语言的风格 /*xxxxx*/ ,不可嵌套注释。
选择循环语句
选择语句,实现分支。具体情况为 if ( 条件 ) { 语句 } else ( 条件 ) { 语句 };循环语句,有while循环,do...while循环和for循环。
int main()
{
int i = 0;
printf("加入比特\n");
printf("要好好敲代码吗(1/0)?\n");
scanf("%d", &i);
if (i == 1)
{
printf("好offer\n");
}
else
{
printf("药丸\n");
}
return 0;
}
int main()
{
int line = 0;
printf("加入比特\n");
while (line<20000)
{
printf("敲%d了代码\n",line);
line++;
}
printf("牛逼坏了拿到了好offer\n");
return 0;
}
函数
函数主要传参和返回值的类型要对应
int ADD(int num1, int num2)
{
scanf("%d %d", &num1, &num2);
int sum = num1 + num2;
return sum;
}
int main()
{
int num1 = 0;
int num2 = 0;
输入
//scanf("%d %d", &num1, &num2);
相加
//int sum = num1+num2;
输出
//printf("sum=%d\n", sum);
//int output = ADD(num1,num2);
//printf("%d\n", output);
printf("%d\n", ADD(num1, num2));
return 0;
}
数组
定义是一组相同类型的元素组成的集合,数组的使用是根据下标来的,从0开始数。
int main()
{
//数组 - 相同元素的集合
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%3d", arr[i]);
}
printf("\n");
for (i = 9; i >= 1; i--)
{
printf("%3d", arr[i]);
}
return 0;
}