1.变量和常量
生活中有些值是不变的,如圆周率,性别等等,有些值是可以改变的,如年龄,体重。在C语言中,不变的值用常量的概念来表示,可以改变的值,用C语言中的变量的概念来表示
定义变量的方法:
数据类型 变量的名称 = 变量的值;
int age = 18; float weight = 45.5f; char ch = 'w';
变量的分类
1.局部变量
2.全局变量
#include <stdio.h> int global = 2022;//定义在函数外部,全局变量 int main() { { int local =2023;//定义在大括号内部,局部变量,只在最近大括号内起作用 } int global = 2020;//这里不会发生重定义,局部变量 printf("%d\n",global);//输出2020; return 0; }
当局部变量与全局变量同名时,局部变量优先使用。
scanf函数与printf函数
scanf,printf都是库函数
库函数 - C语言的编译器提供的现成的函数,可以直接使用,但在使用的时候要包含头文件<stdio.h>
scanf的作用是输入数据,数据从键盘读取到内存中。
语法:scanf("输入格式",&要输入变量的名称”);
&取地址符。&a取出a的地址,表示a存放在內存中的哪里,这样你输入的值就会存放在a中
printf的作用是输入数据,数据从内存打印(输出)到屏幕上。
语法:printf("输出格式",要输出变量的名称”);
格式:
%d - 整形
%c - 字符型
%s - 字符串
%f - float
%lf - double
%p - 地址的打印
等等..
变量的使用
#include <stdio.h> int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("请输入两个要相加的数"); scanf("%d %d",&num1,&num2); sum = num1 + num2;//将两个数相加的值存放在变量sum中 printf("sum = %d\n",sum);//,后面sum的值会代替""内的格式%d来输出 return 0; }
变量的作用域和生命周期
作用域(scope)
程序设计概念,通常来说,一段程序代码中所用到的名字并不是一直有效/可用的。而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围
//局部范围的作用域 int main() { { int a = 10; printf("%d", a); } //printf("%d",a);//报错 超出了a的作用范围 return 0; }
2.全局变量的作用域是整个工程
//全局变量的作用域 int a = 2023;//全局变量在外部定义,在{}外定义 void test()//函数使用时需要调用,后面文章会讲到 { printf("2---> %d\n", a);//可以使用全局变量a } int main() { printf("1---> %d\n", a);//可以使用全局变量a test();//调用函数test return 0; }
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
int main() { {//变量创建的本质是在内存中开辟一块空间,存放数据 int a = 3; int b = 5; int c = a + b; printf("%d", c); }//出作用域之后这些变量就没有便要存在了,就会被销毁 //销毁,把内存空间还给操作系统 }
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2.全局变量的生命周期是:整个程序的生命周期。
//程序是从main函数开始执行,而a变量main函数内都可以使用 //所以全局变量a的生命周期是整个程序的生命周期 int a = 10; int main() { //--- //--- //--- return 0; }
常量
C语言中的常量和变量的定义形式有所差异,常量不可以被修改。
C语言中的常量分为以下几种:
1.字面常量
2.const 修饰的常变量
3.#define 定义的标识符常量
4.枚举常量
1.字面常量:直接写出来的都是字面常量
int main() { 3.14; 1000; 'a'; "qwer";//字符串常量,后面会讲 "";//空字符串常量 "a";//有一个字符的字符串 }
2.const修饰的常变量
int main() { //这里a具有了常属性,不能被改变,但本质上还是变量 const int a = 3; printf("%d\n", a); //a = 10;//报错,不可以修改 printf("%d\n", a); //数组 int n = 10; //int arr[n];//报错n是变量,数据必须指定大小必须是常量,如arr[10],有10个空间 const int m = 10; //int arr[m];//报错,m是常变量,本质还是变量,只是不能被修改,而C++中是被彻底修改了arr[m]正确 }
3.#define 定义的标识符常量
//可以理解为给这个 常量取个其他的名字 #define SIZE 10 //SIZE 的值就是10 来表示大小 #define MAX 100 #define CH 'W' int main() { 10;//不能直观表达要白表示的意思 int a = SIZE; int arr[SIZE] = { 0 }; printf("%c", CH); return 0; }
4.枚举常量。枚举就是一一列举。生活中有些是可以一一列举的,如性别:男,女,其他。三原色,血型。用的是C语言中的关键字enum。
//enum定义枚举常量 enum SEX { //列出来枚举类型enum SEX的可能取值,用','分开 MALE,//可以设置初始值,默认从0往后排,后面依次加一 FEMALE=4,//后面的从4往后排 SECRET,//5 }; int main() { enum SEX s = MALE;//枚举变量赋值,赋值的值是确定的 //MALE = 5;//报错不可修改 printf("%d\n", MALE);//输出0 printf("%d\n", FEMALE);//输出4 printf("%d\n", SECRET);//输出5 return 0; }
2.字符串
字符串就是一串字符
字符如:a ! 1 @ q w 2 3 键盘上敲得任何东西都是字符,使用是要加单引号 ' '。
"hello"
这种由双引号引起来的一串字符称为字符串字面值,简称字符串
注意:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串的内容。转义字符后面会讲
int main() { char c; c;//这个c是变量名,为了区分字符c ,所以字符c写成'c' 'c'; //ch[6]可以存放长度为6的字符串 char ch[6] = { 'a','b','c','d','e','f' };//字符数组,没有'\0' char ch2[] = "abcdef";//可以看到ch[7]为'\0',就是第7项是'\0',但是长度是6 //printf 以%s格式 打印字符串时, //就是从你给的地址开始打印,一直打印遇到'\0',停止 //数组名本质是个地址,即存储数组在内存中的位置 printf("%s\n", ch);//这种打印ch之后是未知的,所以会出现乱码,可以主动为ch后添加'\0',增加一项,就不会出现乱码了 printf("%s\n", ch2);//在ch2字符串做最后有'\0',所以不会出现乱码 char ch3[] = {'\0', 'a','b','c','d','e','f' }; char ch4[] = "\0abcdef"; printf("%s\n", ch3);//不会打印 printf("%s\n", ch4);//不会打印 return 0; }
这里可以通过F10,也就是调试里的逐过程,每按一次执行一条语句。按过一次F10后,可以通过调试--窗口--监视,输入你要监视的ch和ch2,再按F10观察他们的变化。会发现ch2字符串后还有一个\0。
strlen()求字符串长度函数
strlen()函数也是库函数,可以直接使用,使用时要包含头文件<string.h>
//strlen()库函数,求字符串长度,要包含头文件 <string.h> //就是从给定的地址,向后数字符,直到遇到\0结束,\0不统计在内 //数组名的本质是存放该数组的地址 #include<string.h> int main() { char ch1[] = { 'a','b','c' };//[a][b][c],\0的位置是未知的 char ch2[] = "abc";//[a][b][c][\0] int len1 = strlen(ch1); int len2 = strlen(ch2); printf("%d\n", len1);//打印随机值,因为\0的位置未知 printf("%d\n", len2);//3 return 0; }
转义字符
//转义字符 -- 转变原来的意思 //'\0' '\n'等都是特殊字符,转义字符 //假如要到屏幕打印一个目录:c:\test\test.c int main() { printf("(are you ok??)\n"); //有些编译器是不能够打印出来的 //??)早期叫做三字母词 代表 ] // VS忽略三字母词 //are you ok] printf("(are you ok\?\?)\n"); // '\n'不再是 n 变成了换行符 printf("c:\test\test.c\n");//'\t'被认为成转义字符,水平制表符 Tab //Tab大小可以设置,默认4个空格,通过 工具 - 选项 - 文本编译器 - C/C++ - 制表符 printf("c:\\test\\test.c");//再次转义,可以输出 \\转义为普通斜杠 printf("%c\n", '\'');//打印 ' 冒号 \' printf("%s\n","\"");//打印 " 双引号 \" printf("%s\n", "'");//字符串形式打印 ' printf("\a\n"); // 警告字符 蜂鸣 \a printf("abc\bef\n");//abdef 退格符 \b // \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 // \ddd d d d 代表1 - 3个八进制数字 如 、 // \xdd d d 表示1 - 2个十六进制数字 printf("%c\n", '\130');//以字符格式输出 //8进制的130,转化为10进制后得到88,ASCII码值对应 'X' printf("%c\n", '\x31'); //16进制的31,转化为10进制后得到49,ASCII码值对应 '1' printf("%d\n", strlen("c:\test\x11\328\test.c"));//15 //8不是8进制内的数,\32与8是两个字符 return 0; }
为了方便字符型数据在内存中存储,所以为每个字符进行了编号,就是ASCII码表,每个字符都有自己的编号。65--a,97--A,49--1。
注释
作用:
1.代码中有不需要的代码可以直接删除,也可注释掉
2.代码中有些代码比较难懂,可以加一下注释文字
//以//开头的注释风格是C++风格 /* C语言注释风格, 缺陷:不支持注释嵌套,注释内不能还有注释 */
3.选择语句
1.if语句
2.switch语句(后面文章讲)
if语句:
int main() { printf("好好学习\n"); printf("你愿意好好学习吗?(1/0)>:"); int flag = 0; scanf("%d", &flag);//输入你的选择 if (flag == 1)//==判断相等,=是赋值操作 { printf("好offer\n");//满足(flag == 1)条件打印 } else if(flag == 0)//else表示没有满足上面最近if的条件时执行它的语句 { printf("进场打螺丝\n"); //没有满足flag==1的条件,并且flag==0时打印 } return 0; }
4.循环语句
1.while语句
2.for语句(后面文章讲)
3.do...while语句(后面文章讲)
while循环语句:
int main() { int line = 0; while (line < 50000)//满足(line<50000)条件时,执行下面括号里的内容 { printf("敲代码 %d\n",line);//循环体 line++;//++自增。每次加一 } if (line = 50000) printf("好offer\n"); else//不满足上面if条件时执行,满足ling=50000时不执行,跳过 printf("差点意思\n"); return 0; }