【从0到一手把手带你学C语言】初始C语言2

文章介绍了C语言中的基本概念,包括字符和字符串的定义,其中字符串以作为结束标志。转义字符用于特殊字符的表示,例如ddd用于八进制表示。注释在代码中起到解释作用,有C风格和C++风格两种。选择语句主要是if结构,用于条件判断。循环语句如while用于重复执行代码块。函数用于封装代码,提高复用性。数组是一组相同类型元素的集合,可通过下标访问。文章强调了这些基础知识在C语言编程中的重要性。
摘要由CSDN通过智能技术生成

1. 字符与字符串

1.1 字符

键盘上的任意一个按键都可以是字符
比如字母a在C语言中用’a’表示 在C语言中称作字符


1.2 字符串

“hello bit” “a” “”
这种由双引号引起来的一串字符称为字符串字面值(string literal)或者简称字符串
我们把字符串用字符数组存起来

在这之前 我们需要知道简单的类型对应的格式符

格式符数据类型
%d有符号整形
%f单精度浮点型
%lf双精度浮点型
%c字符
%s字符串
%p指针

现在我们来看这段代码
在这里插入图片描述
我们定义了一个字符数组str 用来存放字符串 我们可以注意到:C语言中将字符串中每个字符分别存放在数组每个元素中
那为什么str[9]会有‘\0’呢?
C语言规定 字符串的结束标志是一个 ‘\0’ 的转义字符 所以在字符串中C语言会默认给字符串最后加上结束符
在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
也就是说 虽然字符串长度是不包括结束符 但是存放字符串的数组需要额外给字符串分配结束符的空间,所以数组元素是9+1

结束符有什么作用呢?
我们先来看这段代码
在这里插入图片描述
我们发现 str1打印的并不是只abc 后面还有奇奇怪怪的这是为什么呢?
‘\0’是字符串的结束标志,也就是如果程序要读取字符串 会一直读取直到找到’\0’
之前说过 字符串最后会默认加上结束符 所以打印str2时c后面会有’\0’此时读取结束
所以str2打印的是abc
对于str1来说 打印str1打印到c后仍然没找到’\0’ 程序继续往后读取
在这里插入图片描述
至于结束符和c之间有什么 我们也不知道 所以会打印奇奇怪怪的

可能大家会疑惑str1没有结束符 就不能叫字符串 为什么格式符还是打印字符串的%s呢?
我理解的是打印字符串和打印数不同,如果我们格式符是%d,而表达式的值是浮点数,结果会很奇怪,但是格式符是%s,即使str1中存放的不是字符串程序仍然会从str1开始打印,直到找到结束符,此时打印在屏幕上的abc烫烫?龄/x瞜是字符串,

总结:

  • 在没有限定数组长度时,将字符串存入数组中,数组最后一个元素默认为\0
  • \0 是结束标志,不算作字符串内容,占内存空间
  • 格式符%s用来打印字符串

2. 转义字符

转义字符就是在字符前面加上\改变原本字符的意思
常见的转义字符:
转义字符

我们简单举几个例子

#include<stdio.h>
int main()
{
//不使用转义字符表示单引号
char a = '''//报错 编译器不知道哪两个单引号进行匹配
char a = '\''//将原本单引号进行转义,使它不能和单引号配对
//不使用转义字符表示双引号
char b[] = """//报错 编译器不知道哪两个双引号进行匹配
char b[]= "\""//将原本双引号进行转义,使它不能和双引号配对
return 0;
}
重点讨论最后两个转义字符
#include<stdio.h>
int main()
{
	char a = '\130'
	printf("%c",a ); //打印结果为X
	return 0;
}
我们发现X的AXCII值是88,八进制130对应的十进制恰好就是88
我们得出结论:

总结:

  1. 转义字符\ddd(ddd为八进制)对应的应该是一个字符 字符的ADSCII是ddd转换为10进制对应的数字
  2. 转义字符\xdd(dd为十六进制)对应的应该是一个字符 字符的ADSCII是dd转换为10进制对应的数字

有几种特殊情况 我们进行讨论

2.1 \ddd的特殊情况

1.当转义字符\ddd过大时
2.当\后面的数字超过3位或者不超过3位但是其中有一个数字大于7,a中存储的是最后一个字符

第一种情况:
我们知道ASCII值的范围是0-255对应的8进制是399(针对八进制)
在这里插入图片描述
当转义字符八进制时是3位时,ddd超过399编译器报错

第二种情况:
当\后面的数字超过3位或者不超过3位但是其中有一个数字大于7,a中存储的是最后一个字符(针对八进制)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们拿第三个说明

#include<stdio.h>
int main()
{
	char a = '\130123';
	//等价于
	char a = 'X123'
	//四个字符占四个字节
	//但是char只有一个字节 所以会截断
	//根据计算机存储数据是以小端存储所以会取低位及3
	return 0;
}

我们来看一道笔试题:

//程序输出什么?
#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));//6
    // \62被解析成一个转义字符
    printf("%d\n", strlen("c:\test\628\test.c"));//14
    return 0; }
\ddd是八进制数 所以d是0-7 所以\628是两个字符

注:特例均拿\ddd举例子 \xdd类似请自行验证
总结:

  • 当\后面数字没超过三位时,但是超过399,编译不通过(针对\ddd)
  • 当\后面数字超过三位或者有大于7的数字,取最后一个字符作为结果(针对\ddd)

3. 注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
#include <stdio.h>
int Add(int x, int y) {
    return x+y; }
/*C语言风格注释
int Sub(int x, int y)
{
    return x-y;
}
*/
int main()
{
    //C++注释风格
    //int a = 10;
    //调用Add函数,完成加法
    printf("%d\n", Add(1, 2));
    return 0;
}

注释有两种风格:

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

4. 选择语句

生活中处处面临选择如:
如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择!

程序也会面临选择
有两种选择语句

  • if
  • switch
    本章只介绍if,后面会介绍switch
if(a)//说明a成立
{
……  //内部由实际情况决定
}
#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; }

5. 循环语句

有些事情我们需要一直做,比如:每天学习,吃饭
重复的做某些动作称为循环

C语言中怎么实现循环呢?

  • while(本章讲)
  • do while(后面讲)
  • for(后面讲)
while语句的基本结构
while(a)  //()里的称为循环条件
{
……  //{}内的称为循环体
}
//满足a才会做循环体 知道某次不满足a

循环体通常执行n次后可以让a不成立 跳出循环


6. 函数

先看代码

#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; }

我们将num1和num2加起来了
有时候 我们不只一次需要两数相加,那我们可不可以单独把相加这个功能保存起来呢?

上述代码,写成函数如下:
#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; }

我们将相加功能封装成add函数,实现了两个数的相加
我们现在来详细的看一下这个函数
在这里插入图片描述
Add作用是实现2数相加 两个数是整形 所以()里面的是int,int类型 变量名无所谓是什么,我们想要得到一个两数相加的结果,所以我们让结果是a+b并且将结果返回,
结果类型是整形 也叫函数返回类型 所以结果类型是int
总结:函数的特点就是简化代码,代码复用。


7. 数组

要存储1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合

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; }

最后

本章内容知识没有进行深入的探讨知识点,本章及后续一章内容知识将C语言的知识点进行粗略的解释 只是见猪跑,所以有些内容可能不详细或者和您了解的有偏差,这很正常,后续的文章会详细介绍C中的每章知识点,如果您觉的对您有帮助,希望不要吝啬手中的赞,这对我来说很重要,这也会成为我学习的动力,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值