文章目录
C语言学习第三节
一、变量
1. 变量介绍与初始化
1)变量
介绍完数据类型之后,我们可以用类型创建变量,
- 变量——数据发生变化的量
- 常量——数据不变化的量
代码示例:
int main()
{
int a;
int b;
int c, d, e;//这些都是可以的,但不推荐用这个
float a;
char a;
return 0;
}
变量命名规则:
- 只能由字母(包含大小写)、数字、下划线(
'_')组成 - 不能以数字开头
- 长度不能超过63个字符
- 变量名中区分大小写
- 变量名不可用关键字
代码示例:
//命名规则
int abc;
int ABC;//区分大小写,两者不同
char 2b;//错误
char _2b;//正确-不能以数字开头,可以下划线开头
int char;//错误——变量名称不可以用关键字
2)初始化——对变量赋初值
- 不初始化,一些编辑器会报错
代码示例:
int a = 10;
float b = 2.4;
char ch1 = ‘x’;
2. 变量分类
变量分为全局变量与局部变量
- 全局变量——在大括号外部定义的变量
- 局部变量——在大括号内部定义的变量
局部变量只能在其所在的括号内被打印,在括号外是不可以被打印的;但是若局部变量包含一个大括号,那么可以在其所在的括号内打印,也可以在包含的大括号内打印
代码示例(变量名称不一样):
int a = 10;//全局变量
int main()
{
int b = 100;//局部变量
{
int c = 1000;//局部变量
printf("%d\n", c);
printf("%d\n", a);
printf("%d\n", b);
}
printf("%d\n", a);
printf("%d\n", b);
//printf("%d\n", c);报错——c是局部变量,只针对于其所在的括号内
return 0;
}
1000 10 100 10 100
为方便理解,我们将这个代码的a假设为社会的共享单车,b假设为学校的共享单车,c假设为个人的自行车,那么c所在的括号内,我可以骑自己的自行车也可以骑学校和社会的;但是学校里的人是不能骑我的自行车,只能骑学校和社会的
代码示例(变量名称一样)
- 变量名称一样时,局部变量优先输出
#include <stdio.h>
int main()
{
int a = 100;
{
int a = 10;
printf("%d\n", a);//变量名称一样,局部变量优先输出
}
printf("%d\n", a);
return 0;
}
10;100
3. 变量存储位置
内存可以分为多个区域,这里我们只重点说明三个区域:栈区、堆区、静态区
- 栈区:存放局部变量、函数参数(后面介绍)
- 堆区:动态内存管理(后面介绍)
- 静态区:存放全局变量、静态变量
二、操作符
操作符又称为运算符,算术操作符是其中一种,包含+-*/%,这些又称为双目操作符
+-*/%称为操作符- 如
24+36中24与36为操作数 - 双目操作符——有两个操作数
1. 算术操作符
1)+
#include <stdio.h>
int main()
{
//+
int a = 10 + 100;
printf("%d\n", 10 + 20);
printf("%d\n",a);
return 0;
}
30 110
2)-
#include <stdio.h>
int main()
{
//-
int b = 10 - 100;
printf("%d\n", 10 - 20);
printf("%d\n", b);
return 0;
}
-10 -90
3)*
进行乘法运算时要注意计算结果不能超过数据类型取值的最大值,否则计算机将会随机得到结果,这个结果是错误的
#include <stdio.h>
int main()
{
//*
int c = 10 * 100;//这里进行的整数乘法,算出来的结果不能超过int取值范围的最大值
int d = 10000000 * 1000000000000;
printf("%d\n", 10 * 20);
printf("%d\n", c);
printf("%d\n", d);
return 0;
}
200 1000 -1981284352
4)/
- 对于除号来说,整数 / 整数是执行的整数除法,得到的结果是商,不带余数
- 对于除号来说,想要得到小数,即执行小数除法,需要在除号两边至少有一个是小数
- 输出小数结果时,一定要注意打印格式是%f,不能是%d
代码示例一:
#include <stdio.h>
int main()
{
// /
//对于除号来说,整数 / 整数是执行的整数除法,得到的结果是商,不带余数
//对于除号来说,想要得到小数,即执行小数除法,需要在除号两边至少有一个是小数
printf("%d\n", 10 / 20);
printf("%f\n", 10.0 / 20);
printf("%f\n", 10 / 20.0);
printf("%f\n", 10.0 / 20.0);
printf("%f\n", 10.0 / 20);//%f打印默认保留6位小数
return 0;
}
0 0.500000 0.500000 0.500000 0.500000
代码示例二:
#include <stdio.h>
int main()
{
int score = 5;//这里是int,下面打印使用%d
{
score = (score / 20.0) * 100;//需有小数才能计算出25,否则得到的是0
printf("%d\n", score);
}
return 0;
}
25
5)%——取模运算(取余)
- 两个整数相除之后得到的余数,这里只能进行整数除法,不能用小数
正数取模运算代码示例:
#include <stdio.h>
//%——取模(余),表示两个整数相除之后得到的余数
//这里只能进行整数除法,不能用小数
int main()
{
printf("%d\n", 50 % 4);
int a = 100 % 6;
printf("%d\n", a);
return 0;
}
2;4
负数取模运算代码示例:
- 结果的符号与%之前的数符号相同
#include <stdio.h>
//负数求模,结果的正负号与%前面的数的符号相同
int main()
{
printf("%d\n", 11 % -3);
printf("%d\n", -11 % -3);
printf("%d\n", -11 % 3);
return 0;
}
2 -2 -2
2. 赋值操作符
=进行赋值操作
1)连续赋值
代码示例:
#include <stdio.h>
//连续赋值
int main()
{
int a = 2;
int b = 4;
int c = 5;
c = a = b + 2;//连续赋值,但是不推荐;一般拆开一步一步运行
printf("%d\n", c);
printf("%d\n", a);
a = b + 2;
c = a;
printf("%d\n", c);
printf("%d\n", a);
return 0;
}
6;6;6;6
2)复合赋值
复合赋值中包含+=、-=、*=、/=、%=、>>=、<<=、|=、^=、&=
- 本节中只重点说明
+=、-=、*=、/=、%= +=等价于a=a+?-=等价于a=a-?*=等价于a=a*?/=等价于a=a/?%=等价于a=a%?
代码示例:
#include <stdio.h>
//复合赋值
int main()
{
// +=
int a = 9;
a + 2;
printf("%d\n", a);
a = a + 2;
printf("%d\n", a);
a += 2;
printf("%d\n", a);
// -=
int b = 9;
b - 2;
printf("%d\n", b);
b = b - 2;
printf("%d\n",b);
b -= 2;
printf("%d\n", b);
// *=
int c = 9;
c * 2;
printf("%d\n", c);
c = c * 2;
printf("%d\n", c);
c *= 2;
printf("%d\n", c);
// /=
int d = 9;
d / 2;
printf("%d\n", d);
d = d / 2;
printf("%d\n", d);
d /= 2;
printf("%d\n", d);
// %=
int e = 9;
e % 2;
printf("%d\n", e);
e = e % 2;
printf("%d\n", e);
e %= 2;
printf("%d\n", e);
return 0;
}
9 11 13 9 7 5 9 18 36 9 4 2 9 1 1
3. 单目操作符
根据双目操作符定义,单目操作符是指只有一个操作数,这里我们介绍++、--、+(正)、-(负)
1)++
++是自增的符号,分为前置++与后置++
- a++与++a都是a自增1,对a来说无区别,但是性质不同
- a++是后置++,先使用,后+1;即先打印出a的值,再+1
- ++a是前置++,先+1,后使用;即先+1,再打印出a的值
前置++代码如下:
#include <stdio.h>
//单目操作符
//前置++
int main()
{
int a = 2;
++a;
printf("%d\n", a);
return 0;
}
3
后置++代码示例:
#include <stdio.h>
//单目操作符
//后置++
int main()
{
int a = 2;
a++;
printf("%d\n", a);
return 0;
}
3
性质示例:
#include <stdio.h>
//单目操作符
//性质——前置++是先+1再使用;后置++是先使用再+1
int main()
{
int a = 1;
int b = a++;//后置++,先给b赋值,a再+1
printf("%d\n", a);
printf("%d\n", b);
int c = 1;
int d = ++c;//前置++,c先+1,之后给d赋值
printf("%d\n", c);
printf("%d\n", d);
return 0;
}
2;1;2;2
2)--
--是自减的符号,分为前置–与后置–
- a–与–a都是a自减1,对a来说无区别,但是性质不同
- a–是后置–,先使用,后-1;即先打印出a的值,再-1
- –a是前置–,先-1,后使用;即先-1,再打印出a的值
前置–与后置–代码如下:
#include <stdio.h>
//单目操作符
//前置--与后置--
int main()
{
int a = 2;
--a;
printf("%d\n", a);
a--;
printf("%d\n", a);
return 0;
}
1;0
性质示例:
#include <stdio.h>
//单目操作符
//性质——前置--是先-1再使用;后置--是先使用再-1
int main()
{
int a = 1;
int b = a--;//后置--,先给b赋值,a再-1
printf("%d\n", a);
printf("%d\n", b);
int c = 1;
int d = --c;//前置--,c先-1,之后给d赋值
printf("%d\n", c);
printf("%d\n", d);
return 0;
}
0;1;0;0
3)+(正)与-(负)
- 正号、负号都是操作符,并且正号操作符是可以省略的
示例如下:
//单目操作符
//+、-(正号、负号)
int main()
{
int a = 10;
int b = +10;
int c = -10;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
10;10;-10
4. 强制类型转换操作符
- 将一个数据类型转换为其他数据类型,用()实现
- 作用:将类型转换的警告消除
代码示例:
#include <stdio.h>
//强制类型转换操作符——消除警告
int main()
{
int a = 3.14;
printf("%d\n", a);//这里会出现警告
int b = (int)3.14;
printf("%d\n", b);//这里不出现警告
return 0;
}
3;3——结果一样,差别在于有无警告
三、scanf与printf
1. printf函数
在第一篇文章中已经介绍printf的一些基础内容和使用,这里我们详细的来说明该函数
- printf函数的写法: printf(“****”, “", "”,…); 这里面逗号之前的可以称为一个参数
- printf中的f为format(格式化),表示定制输出格式,如:
%d输出为整数,%c输出为字符 - printf函数不能自动换行,需要
\n进行换行,可以放置字符串末尾换行,也可以放置中间进行换行
1)占位符
- 占位符是占位置,指这个位置可以用其他值代替
- 占位符是一一对应的,若有n个占位符,则printf函数有n+1个参数
- 若参数少于对应占位符的个数,则printf函数将会输出内存中的任意值
- 占位符必须%在前
代码示例:
#include <stdio.h>
//printf函数的占位符
int main()
{
printf("这有3个苹果\n");//这里只能输出这一句,但我不一定有三个苹果
int a = 8;
printf("这有%d个苹果\n",a);//这里的%d就是一个占位置的作用,我们可以改变a的值
//多个占位符——第一个参数就是输出的东西,第二个和第三个就是占位符要填进去的东西
//占位符是一一对应的,有n个占位符,则printf函数有n+1个参数
printf("%s will come back at %d o'clock\n", "zhangsan", 8);
printf("%s will come back at %d o'clock\n", "zhangsan");
return 0;
}
这有3个苹果;这有8个苹果;zhangsan will come back at 8 o'clock; zhangsan will come back at -641 o'clock;
2)占位符列举
%c:字符 //char%d:十进制整数(有符号的10进制整数)//int%f:小数(包含float 类型和double 类型)//float——%f double——%lf
用printf函数打印小数类型时,float与double类型的数据都可以用%f打印
但详细说明:float用%f打印,double用%lf打印,long double用%Lf打印
%hd:⼗进制short int类型%hu:unsigned short int类型%ld:⼗进制long int类型%lu:unsigned long int类型%lld:⼗进制long long int类型%llu:unsigned long long int类型%Lf:long double类型浮点数%p:指针(⽤来打印地址)%s:字符串%u:⽆符号整数(unsigned int)%x:⼗六进制整数%zu:size_t类型——sizeof的长度计算%%:输出⼀个百分号
3) 输出格式
printf()函数可以限制输出的格式,如下
(1)限制宽度与限制小数位数
- printf函数可以限定占位符的最小宽度,如
%5d限制整数最小长度为五个单位 - 默认右对齐,若整数不满设定的宽度,则会在整数前面加空格,保证总长度在五个长度;若整数长度超过五个长度,则正常输出
- 左对齐需要在%与多少d之间加一个
- - 对于小数来说,用
%f打印,限制小数宽度方法跟上面一致 - 限制小数位数。形如
%.2f的形式,限制小数位数两位 - 限宽与小数位数可以用*代替,但是必须将参数放在前面
代码示例:
#include <stdio.h>
//限制最小宽度
int main()
{
printf("%d\n",123);
printf("%6d\n", 123);//这里123占三个宽度,一共六个宽度,123前面有三个空格
//左对齐
printf("%-6d\n", 123);
printf("%9f\n", 123.45);//这里123.45占十个宽度,因为f保留六位小数
printf("%12f\n", 123.45);
//保留小数位数用.
printf("%.2f\n", 123.45);
printf("%.7f\n", 123.45);
//混合使用
printf("%12.4f\n", 123.45);
//限宽与小数位数可以用*代替,但是必须将参数放在前面
printf("%*.*f\n", 12,4,123.45);
return 0;
}

(2)总是显示正负号
打印负数时会出现,但是正数不出现正号,因此这里我们让正数一直出现正号,使用%+
代码示例:
#include <stdio.h>
//让正数出现正号
int main()
{
printf("%+d\n", 123);
printf("%+d\n", -123);
return 0;
}
+123;-123
(3)打印部分字符串
对于一个字符串,只想打印其中的一部分,使用%.[m]s,也可以省略[],这里的m为数字,表示要输出的长度是多少
代码示例:
#include <stdio.h>
//打印部分字符串
int main()
{
printf("%s\n", "abcdefghij");
printf("%.5s\n", "abcdefghij");
return 0;
}
abcdefghij; abcde
2. scanf函数
- scanf函数是输入变量值函数,printf函数是输出变量值函数
- 形式为
scanf("%d",&变量名),scanf函数输入的变量数是放在一个地址中,所以需要一个地址,这里的地址就是变量名 - &是取地址符号,如
&score是指取score变量的地址
代码示例:
#include <stdio.h>
//scanf函数
//输入数使用scanf函数,输出数使用printf函数
int main()
{
int score = 0;//初始化
printf("请输入成绩:");
scanf("%d", &score);
//scanf("%d", score);这样是不能直接写的,需要加上&
// 因为scanf函数输入的值是放在一个地址上的,所以需要一个地址
//&是取地址符号,&score是取score变量的地址
printf("成绩是:%d\n",score);
return 0;
}

这里可能会有小伙伴出现问题,在下一篇会重点讲一下这个问题
附录
代码详情——在gitee中
3万+

被折叠的 条评论
为什么被折叠?



