初识c语言之第二次笔记
一:常量
1:字面常量
#include <stdio.h>
int main()
{
//字面常量
3.14;
"abcdef";
'a';
return 0;
}
2: const 修饰常变量
注意:常变量不是常量,是常~变量
一开始不加const的时候,num被定义后可以直接修改变量
#include <stdio.h>
int main()
{
int num = 100;
num = 200;
printf("%d ",num);//200
return 0;
}
加了const之后
#include<stdio.h>
int main()
{
const int num = 100;
num = 200;
printf("%d ",num);//err 不能直接修改
return 0;
}
上面例子上的 num 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了变量 num 不能直接被改变,但是num本质上还是一个变量的,所以叫常变量。
插个小知识点——你知道头文件#include<stdio.h>中stdio.h的含义么?
std代表standard 标准,i代表input 输入,o代表output 输出
#include<stdio.h>也叫标准输入输出头文件
3:#define 定义的标识符常量
#include<stdio.h>
#define MAX 1000
int main()
{
int a = MAX;
printf("%d\n ",MAX); //1000
MAX = 2000;//err
return 0;
}
上述例子上的MAX被称为define定义的标识符常量,与const结果一样,define定义之后,MAX不能直接被改变。
4:enum 枚举常量
枚举常量比较少见,但还是稍微提一下。
生活中的枚举就是一一列举
#include<stdio.h>
enum Sex//一一列举
{
//注:枚举类型中列举的可能取值都是枚举常量
MALE,//内部储存为0
FEMALE,//内部储存为1
SECRET//内部储存为2
};//本代码的括号中MALE,FEMALE,SECRET是枚举常量
int main()
{
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
注意:枚举常量的默认是从0开始,依次向下递增1。如果把上述例子中的MALE,改成MALE=4,则FEMALE SECERT向下递增,打印出来的MALE FEMALE SECRET分别为4 5 6。
二:字符串、转义字符与注释
1:字符串
"hello world"
"a"
" "
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。C语言没有字符串对应的数据类型。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 只是结束标志,不算作字符串的内容。
下面的知识点是易错点!!! 体现出了\0的重要性
#include<stdio.h>
#include<string.h>//strlen库函数的头文件
int main()
{
char arr1[]="abcdef";
char arr2[]={
'a','b','c','d','e','f'};
//这两个数组定义一的方式一样吗?
printf("%s\n",arr1);
printf("%s\n",arr2);
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
//strlen是一个库函数,string strlen的缩写,用来求字符串长度,统计的是\0之前出现了多少个字符
//输出:
//abcdef
//(abcdef后面的部分随机(直到找到\0才停下来))
//6
//(随机值)
//原因:arr1数组第7个元素为\0,而arr2数组只存储了6个字符,第一个可以找到
//字符串的结束标志,而第二个找不到,只能不断地往后找直到找到\0,strlen函数以也以\0为结束的标志,但其不计算\0,原理相同
return 0;
}
2:转义字符
#include<stdio.h>
int main()
{
// \? 在书写连续多个问号时使用,防止他们被解析成三字母词
printf("(are you OK??)\n");
//三字母词: ??) -> ]
//输出:(are you OK]
printf("(are you OK\??)\n");
//如果改成(are you OK\??)就将\??转义为??
//输出即为(are you OK??)
// \' 用于表示字符',而不再被作为表示字符的符号
// \" 用于表示一个字符串内部的双引号,
// \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
printf("%c",'\'');
//输出:'
printf("\"");
//输出:"
printf("\\n");
//输出:\n
//这里的\将特殊字符转义为普通的字符,加上\表示转义后面的字符
// \a 警告字符,蜂鸣,电脑会发出声音
printf("\a");
// \n 换行
printf("\n");
// \r 回车
// \t 水平制表符 相当于键盘上的tab键
// \ddd ddd表示1~3个八进制的数字。 如:\130
printf("%c",'\130');//注意这是一个字符
// \xdd dd表示2个十六进制数字。 如:\x30
printf("%c",'\x63');//注意这也是一个字符
return 0;
}
易错题:
printf("%d", strlen("c:\test\628\test.c"));
最后输出结果是14 因为\t是算一个字符, \62算一个字符,注意:在八进制中没有8(易错!!).
二进制:(0~1),
八进制:(0~7),
十进制:(0~9)
十六进制:(0~15)。
3:注释
三:选择语句
如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择!
#include <stdio.h>
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &coding);
if(coding == 1)
{
prinf("坚持,你会有好offer\n");
}
else
{
printf("放弃,回家卖红薯\n");
}
return 0;
}
四:循环语句
有些事必须一直做,比如我们,日复一日的学习。
在C语言中如何实现循环呢?
while语句-这里简单提一下
for语句(后期讲)
do … while语句(后期讲)
//while循环的实例
#include <stdio.h>
int main()
{
printf("加入比特\n");
int line = 0;
while(line<=20000)
{
line++;
printf("我要继续努力敲代码\n");
}
if(line>20000)
printf("好offer\n");
return 0;
}
五:函数
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;//这个代码只能写两个数相加之和 比较有局限性,写成函数形式就比较方便
printf("sum = %d\n", sum);
return 0;
}
//上述代码,写成函数如下:
#include <stdio.h>
int Add(int x, int y)//int表示返回类型为整型,Add表示函数名,int x与int y表示形参的类型和命名
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
我们用生活中的例子来理解函数
上述例子中 num1与num2表示输入数据,Add表示函数,最后经过函数处理产出了一个结果z放到sum(产品)里面去。
那么函数是怎么调用的呢?
当代码走到了sum = Add(num1,num2);的时候 往int Add(int x,int y)那里走,把num1传递给x,把num2传递给y,算出x+y的值放到z里面,z再返回,将返回的值放到sum里面去,然后再打印。
六:数组
1:数组的定义
要存储1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合。
int arr[10] = {
1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
2:数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
int arr[10] ={
0};
//int表示这个数组的每个元素都是整型
//arr为数组名,[10]表示数组中共有10个元素
//={0}表示对数组进行初始化,使数组的第一个元素等于零
3:数组的使用
char ch1[5] = {
0};//不完全初始化,剩余的默认为初始化为0
char ch2[] = {
'a','b','c'};
char ch3[] = {
0};//ch3里面只有一个元素——0
char ch = 0;//这个0实际上是\0,ASCII码值为0
int arr1[10] = {
1,2,3,4,5,6,7,8,9,10};
printf("%d ", arr1[8]);//9
printf("%d\n", arr1[18]);//越界访问
int arr2[18] = {
1,2,3,4,5,6,7,8,9,10};
printf("%d\n", arr[10]);//0,因为不完全初始化导致10后面全为0
输入10个值给数组
#include<stdio.h>
int main()
{
int arr[] = {
0};
int i = 0;
//while循环
while(i < 10)
{
scanf("%d ",&arr[i]);
i++;
}
i = 0;//i再次初始化
while(i < 10)
{
printf("%d ",arr[i]);
i++;
}
return 0;
}
七:操作符
1:算术操作符
+ - * / %
#include<stdio.h>
int main()
{
int a = 7/2;
//七除二得三余一,结果为三
int b = 7%2;
//取模就相当于取余且取模操作符的左右数字只能是整数
printf("%d\n",a);
printf("%d\n",b);
//输出:
//3
//1
//此时得到的a与b均为整数运算得到的值
float a = 7.0/2;
//当我们输入2.0这样的浮点型常量时,编译器会默认其为double类型
float b = 7/2.0;
//当我们需要进行小数运算时,只需要除号的左右的数字其一为浮点数即可
printf("%.1f\n",a);
printf("%.2f\n",b);
//%f用于打印float类型的数据,前面的.1表示小数点后保留一位,.2表示保留两位
//输出:
//3.5
//3.50
return 0;
}
2:移位操作符
两个大于和两个小于 >> <<
3:位操作符
& ^ |
4:赋值操作符
= += -= *= /= &= ^= |= >>=
我们这里暂时只提部分
#include<stdio.h>
int main()
{
int a = 10;
a = 20;
a += 5;//a加等于5,即表示a = a + 5;
printf("%d",a);//25
a -= 5;//a减等于3,即表示a = a - 5;
printf("%d",a);//20
a *= 2;//等于a = a * 2;
return 0;
}
5:单目操作符
其与双目操作符的区别
比如 2 + 3,2被称为左操作数,3被称为右操作数,有两个操作数我们就叫它双目操作符,单目操作符实际上只有一个操作数
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
(1):!逻辑反操作符
在c语言中,如何表示真假?
答:0表示假,非0表示真
#include<stdio.h>
int main()
{
int a = 10;
if(a)//如果a为真
printf("hehe\n");//非0为真,因此打印出hehe
return 0;
}
(2):sizeof
#include<stdio.h>
int main()
{
int arr[10]={
0};
printf("%d\n",sizeof(arr));//这里用%zu更严谨,%d也是可以的
//计算整个数组的大小 40
printf("%d\n",sizeof(arr[0]));
//计算数组一个元素的大小 4
printf("%d\n",sizeof(arr)/sizeof(arr[0]));
//计算数组元素的个数 10
int a = 0;
printf("%d",sizeof(a));//这个地方的()是可以省略的,计算a的大小 4
printf("%d",sizeof a);//这个代码也是正确的,内容一致 4
//如果sizeof为函数则必须加上括号,
//这里不加括号也是正确的,因此sizeof只是一个操作符而不是函数
printf("%d\n",sizeof(int));
//这个操作符也可以计算类型的大小 4
//printf("%d\n",sizeof int);是不对的必须加括号
return 0;
}
strlen 与 sizeof 的区别:
strlen 是库函数,只能针对字符串,求字符串长度,计算字符串中\0之前的字符个数
sizeof 是操作符,是计算所占内存空间的大小
(3):++ –
前置++与- -:先使用(打印),后++,- -
后置++与- -:先++,- -,后使用(打印)
#include<stdio.h>
int main()
{
int a = 10;
int b = a++;//先使用后++,表示先把10赋给b然后在在a的基础上加1
// b=a;然后a=a+1;
printf("%d %d\n",a,b);//11 10
a = 10;
int c = a--;//同样,先使用后--,表示先把10赋给c然后在在a的基础上减1
// c=a;然后a=a-1;
printf("%d %d\n",a,c);//9 10
a = 10;
int d = ++a;//先++后使用,表示先在a的基础上加1再把11赋给b
printf("%d %d\n",a,d);//11 11
// a=a+1;然后d=a;
a = 10;
int e = --a;//同样,先--后使用,表示先在a的基础上减1再把9赋给b
printf("%d %d\n",a,e);//9 9
// a=a-1;然后e=a;
a = 10;
printf("%d\n",a--);//先使用,再--,所以打印出10
printf("%d\n",a);//,减完之后为9,所以打印出9
return 0;
}
(4):(类型)强制类型转换
#include<stido.h>
int main()
{
int a = 3.14//err,int是整型
//强制转换
int a = (int)3.14;//指把3.14这个double类型的常量强制转化为int类型并赋值给变量a
printf("%d\n",a);//打印3,浮点数强制类型转换为整数会丢失精度
return 0;
}
6:关系操作符
特意强调下两个字符串的比较大小
#include<stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
//两个字符串大小相等是不能用==的,应该用strcmp函数
if(strcmp(arr1,arr2) == 0)
printf("==\n");
else
printf("!=\n");
}
大于:>
大于等于:>=
小于:<
小于等于:<=下标引用、函数调用和结构成员:
不相等:!=
相等:==
7:逻辑操作符
逻辑与: &&
逻辑或: ||
8:条件操作符
如果第一个表达式exp1为真,则整个表达式的值为表达式exp2的值,否则整个表达式的值为表达式exp3的值
exp1 ? exp2 : exp3
#include<stdio.h>
int main()
{
int a = 10;
int b = 5;
printf("%d",a > b ? a : b);//a > b,a,b对应三个表达式
//a>b成立,表达式的值为a的值
//类似于选择语句,找出其中的较大值,输出为10
a = 1;//此时我们改变a的值
printf("%d",a > b ? a : b);
//a>b不成立,表达式的值为b的值
//输出为5
return 0;
}
9:逗号表达式
特点:从左向右依次计算,整个表达式的值是最后一个表达式的结果
exp1, exp2, exp3, …expN
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = 0;
int d = (a += 2,b = b - c + a,c = a + b);
// a = 5, b = 10, c = 15 -> d
printf("%d\n",d);//15
return 0;
}
10:下标引用、函数调用和结构成员
[] () . ->
其中一部分操作符涉及二进制的问题,我们先跳过