新手小白初次接触C语言我们要了解什么呢?(二)

目录

一、常量

1.1字面常量

1.2const修饰的常变量

1.3#define定义的标识符常量

1.4枚举常量

二、字符串+转义字符+注释

2.1字符串

2.2转义字符

2.2.1转义字符含义

2.2.2 笔试题

2.2.3区别

三、注释

四、选择语句 

五、循环语句

六、函数

七、数组

7.1 数组定义

7.2 数组的下标

7.3 数组的使用 


一、常量

C语言的常量通常分为以下几种

  •  字面常量
  • const修饰的常变量
  • #define定义的标识符常量
  • 枚举常量

1.1字面常量

int main()
{
    //字面常量
    5;//整型
    100;
    3.14;//浮点型
    'w';//字符型
    “abcdef”;//字符串型
}

1.2const修饰的常变量

int num = 100;
	num = 200;
	printf("%d", num);//200
	const int num2 = 100;//此时num2不可被修改
//使变量具有常量的属性,就为常变量,但编译器认为它还是变量
	num2 = 300;
	printf("%d", num2);
	return 0;
报错:E0137:表达式必须是可修改的左值

如何验证const修饰的变量具有常量的属性,但依旧是变量呢?

    int n = 10;
	int arr[n] = { 0 };
    报错:C2057:应输入常量表达式

当我用const修饰时:

    const int n = 10;
	int arr[n] = { 0 };
    报错:E0028:表达式必须含有常量值
//可见const修饰n具有常量的属性(不可更改),但编译器认为n依旧是变量

(举个栗子理解一下常变量:中国人拿到了美国国籍,但依旧是中国人)

1.3#define定义的标识符常量

#define M 100
int main()
{
	printf("%d\n", M);//100
	//M=200;M是常量,不可被修改
	int arr[M] = { 0 };//标识符常量是常量
}

1.4枚举常量

枚举-----一一列举

//血型、性别、三原色等等

enum Color//enum是枚举关键字
{
//RED、GREEN、BLUE是枚举类型Color的可能取值,同时也是常量,叫做枚举常量
	RED,
	GREEN,
	BLUE
};
int main()
{
	enum Color c = BLUE;//为c赋值为蓝色
	//验证他们是常量
	printf("%d\n", RED);//0
	printf("%d\n", GREEN);//1
	printf("%d\n", BLUE);//2
	//编译器默认给他们0、1、2的值,不可被更改
	return 0;
}

二、字符串+转义字符+注释

2.1字符串

“hello world”

1.由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

int main()
{
	//当我们存取多个字符时,就需要创建一个数组
	char ch1[] = {'a','b','c'};//三个元素
	char ch2[] = "abc";//四个元素
	//这两个数组有什么区别呢?
    //%s打印字符串,打印到'\0'才停止
    printf("%s",ch1);
    printf("%s",ch2);
	return 0;
}

 通过上图可以看出:ch2实际上在末尾有'\0'作为字符串的结束标志,隐藏在字符串中看不见。

当我们分别打印ch1和ch2时,打印效果如右图,为什么会出现这样的效果呢?

接下来通过内存画图解释一下:

 在ch1中,打印完a,b,c后根本不知道'\0'在哪里,所以后面会打印随机值,出现了烫烫,遇到'\0'后才停止。

 在ch2中打印完a,b,c后遇到'\0',停止打印。

这时候我们会想:如果我们在ch1后面加一个'\0'呢?

char ch1[]={'a','b','c','\0'};//此时有'\0'了,ch1中就有四个元素
printf("%s",ch1);

 我们查看内存后发现:

 2.通过上面的注意我们理解一下:在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

我们需要通过计算字符串的长度,在C语言中:提供了一个库函数可以计算字符串的长度,strlen()

(string length),他需要包含一个头文件#include<string.h>

#include<string.h>
int main()
{
	char ch1[] = {'a','b','c'};//三个元素
	char ch2[] = "abc";
    int len1 = strlen(ch1);
	int len2 = strlen(ch2);
	printf("%d\n", len2);
    printf("%d\n", len1);
	return 0;
}

计算结果为:len1=随机值。len2=3。为什么len2结果是3呢?

也就是说strlen统计的是'\0'之前的字符的个数。不算'\0'

 但是len1的结果是随机值,因为我不知道'\0'的位置在哪里,所以'\0'之前的字符的个数是随机的。

2.2转义字符

2.2.1转义字符含义

首先我们看下面这个例子:

 转义:转变原来的意思

假如我们要在屏幕上打印一个目录: c:\code\test.c

int main()
{
 printf("c:\code\test.c\n");
    return 0;
}

 我们发现压根就打印不出想要的效果,因为被转义了。

简单讲几个: 

 奇葩的退格符

 通常用来考试

 举个栗子:

为什么打印的是;呢?八进制(由0~7组成)的073,通过计算为十进制我们知道:在内存中的字符是通过二进制是不好存储的,我们就对符号编个值,也就是ASCII编码。通过对应ASICII我们发现59的ASCII码值对应的字符是;

 打印结果是:F

 通过计算得:70对应的是F

2.2.2 笔试题

//程序输出什么?
//求字符串长度:
#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));//6
    // \62被解析成一个转义字符
    printf("%d\n", strlen("c:\test\628\test.c"));
    return 0;
}

请问:下面那个结果是几呢?

结果是:14,转义字符占一个字符的长度。(\t,\62,\t)

为什么不是13呢?因为\ddd是八进制数,范围是0~7,所以不是\628

2.2.3区别

接下来区别一下:

数字:0,字符:'0'的本质是对应ASCLII的48,转义字符:'\0'的本质是0


三、注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
int main()
{	//定义一个整型变量a,给a赋值10
	int a = 20;
	return 0;
}

注释风格:

  1. C语言风格的注释 /*xxxxxx*/。缺陷:不能嵌套注释
  2. C++风格的注释 //xxxxxxxx。可以注释一行也可以注释多行

例如:

C语言注释风格下,从/*开始,在函数内部已经出现/*,*/,但是当第一个/*遇到*/就会注释停止,所以会发生如图情况,导致后面内容无法被注释掉。缺陷是:不能嵌套注释


四、选择语句 

#include <stdio.h>
int main()
{
    int coding = 0;
    printf("你会去敲代码吗?(选择1 or 0):>");
    scanf("%d", &coding);
    if(coding == 1)
   {
       prinf("坚持");
   }
    else
   {
       printf("放弃");
   }
    return 0;
}

五、循环语句

  • while语句
  • for语句
  • do ... while语句
#include <stdio.h>
int main()
{
    printf("努力学习\n");
    int line = 0;
    while(line<=20000)
   {
        line++;
        printf("我要继续努力敲代码\n");
   }
    if(line>20000)
        printf("好offer\n");
    else
        pirntf("天天编程");
    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 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;
}

函数的特点就是简化代码,代码复用。


七、数组

7.1 数组定义

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

7.2 数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。

int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9

7.3 数组的使用 

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

int main()
{
	//若执行小数除法,除号左右两端至少有一个是小数
	printf("%d\n", 7 / 2);
	printf("%lf\n", 7 / 2);
	printf("%lf\n", 7.0 / 2);
	/*3
	0.000000
	3.500000*/

	int arr[10];
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr[0]));
	//数组元素个数的计算方法:
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n", sz);
	
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	/*
	3
	15
	4
	3
	*/
	//strlen是库函数
	//strlen是求字符串长度的,关注的是字符串中是否有\0,统计\0之前出现的字符个数
	//sizeof是操作符
	//sizeof只关注占据了多大的内存空间,不关注内存中存放的数据
	//size返回值的单位是字节
}

strlen和sizeof的区别

strlen是库函数
strlen是求字符串长度的,关注的是字符串中是否有\0,统计\0之前出现的字符个数


sizeof是操作符
sizeof只关注占据了多大的内存空间,不关注内存中存放的数据
size返回值的单位是字节

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敖云岚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值