初识C语言_Part 1(零基础超详解!)(二)

简介: 初识C语言_Part 1(零基础超详解!)

5. 字符串


定义:类似于 “hello” 这种被双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。


注意:字符串是以’\0’这个转义字符结尾的。我们来看下面的示例代码:


int main()
{
  char arr1[] = { 'a','b','c' };//将'a' 'b' 'c' 这三个字符存放在arr1数组中
  char arr2[] = { "abc" };//将"abc"这个字符串存放于arr2数组中
  printf("%s\n", arr1);//打印出abc和一堆乱码
  printf("%s\n", arr2);//正常打印abc
  return 0;
}


上述代码第6行在abc之后为何会出现乱码的情况呢?


因为字符串是以’\0’这个转义字符结尾,并且以’\0’作为结束标志,arr1存放的一个一个的字符,并没有将’\0’这个结束标志加在末尾,而arr2存放的字符串,自带’\0’,所以当printf函数打印字符串时,遇到’\0’就停止打印,arr2正常打印,打印arr1时会一直向后打印,直到遇到’\0’才停止,所以会出现乱码的情况。


怎么才能让arr1正常打印呢?我们只需要在arr1这个数组的末尾主动添加一个’\0’即可。


int main()
{
  char arr1[] = { 'a','b','c' ,'\0'};
  char arr2[] = { "abc" };
  printf("%s\n", arr1);
  printf("%s\n", arr2);
  return 0;
}


我们看下面一个例子:


#include<stdio.h>
#include<string.h>//使用strlen函数要引用头文件
int main()
{
  char arr1[] = { 'a','b','c' };
  char arr2[] = { "abc" };
    //strlen用于计算字符串长度
  printf("%d\n", strlen(arr1));//打印一个大于3的随机数
  printf("%d\n", strlen(arr2));//打印3
  return 0;
}


第8行为何会打印一个随机数呢?其实这里更加印证了字符串以’\0’作为结束标志这个知识点,不过’\0’本身只是一个结束标志,不会被算作字符串的内容。


6 转义字符


当我们想通过printf函数打印 c:\code\test.c 这样一个文件目录时,我们试试下面这个方法:


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


却打印出了这个内容


e3fbf1ba715783fa2d6fd2b2bc0900d3_d39d11c6b6b3420c857d68e51f4b18a3.png


显然,不是我们想要的,之所以出现这种情况,是因为这里的 ‘\t’ 被解释成为了其他的意义,也就是说,这里的t被转义了。所以,这里的 ‘\t’ 就是一个转义字符。


定义:在字符集中,以一个反斜杠 \ 开头,后面跟一个特定字符的形式被称为转义字符(又称:反斜杠字符),常见的转义字符大家可以去找找,也不用全部都记住,了解就可以。


这里我们重点讲解两个转义字符


  • \ddd d d d表示1~3个八进制的数字。 如: \130 表示字符X
  • \xdd d d表示2个十六进制数字。 如: \x30 表示字符0


看下边一段代码:


int main()
{
  printf("%c\n", '\130');//打印X
  printf("%c", '\x30');//打印0
  return 0;
}


这里打印出了X和0的原因是:我们日常生活中的每个字符都无法直接放入到内存之中,所以人们为了方便表示每个字符,就给每个字符设计一个编号,将常用的字符统计起来,就构成了ASCLL码表。


代码分析:我们将 ‘\130’ 转为10进制就是88,再去ASCLL码表中找到对应的字符就是X,因为是以%c的格式打印,所以就打印X这个字符,若是%d,则打印88。 ‘\x30’ 转为10进制就是48,对应字符0,最后将0打印出来。


注意:


  • ‘\ddd’ 这里的d代表的是八进制数,只能是0-7的数字。
  • ‘\xdd’ 这里的d代表的是十六进制数,只能是0-f。


7 注释


注释的分类:

  1. /*xxxxxx*/ 这种注释无论中间有多少行代码,都会被注释掉,但是不能嵌套注释。
  2. //xxxxxxxx 这种只能注释一行代码


注释的作用:


  • 代码中有不需要的代码可以直接删除,也可以注释掉
  • 代码中有些代码比较难懂,可以加一下注释文字
  • 被注释掉的内容是不会被编译器编译的,编译器在编译时会将这部分内容忽视掉


8 函数


当我们想要完成两个数的相加时,我们可以用下面这段代码:


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


而假如我们有很多组数据等着我们相加,我们就得每一次都使用这段代码,这样显得过于冗杂,对此,我们可以将两个数相加这种功能封装起来,组成一个函数,一般而言,一个函数对应完成一种功能。


我们将上面的代码改进一下:


//定义了一个Add函数
int Add(int x, int y)
{
  int z = x + y;
  return z;
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  int sum = Add(a, b);//调用Add函数
  printf("%d", sum);
  return 0;
}


这段代码不理解没关系,后期会讲解函数的相关部分。


9 数组


定义:数组就是一组相同类型元素的集合。


//数组的定义方式
int arr[3] = {1,2,3};//定义了能存放三个元素的整型数组,


数组元素的访问:


int main()
{
  int arr[3] = { 1,2,3 };
    //分别访问数组的三个元素
  printf("%d\n", arr[0]);
  printf("%d\n", arr[1]);
  printf("%d\n", arr[2]);
  return 0;
}


e424fc4af5301d39c3eb42b136895abc_741a3ae194474d1abf19e7e5075df859.png


注意:数组中的元素是连续存储的,并且数组的下标是从0开始的,数组的最后的一个元素的下标就是元素个数-1,


10 操作符


操作符的分类:


  • 算术操作符:+ - * / %


  • 移位操作符: >> <<


  • 位操作符:& ^ |


  • 赋值操作符:= += -= *= /= &= ^= |= >>= <<=


  • 单目操作符:


1: !(逻辑反操作)


C语言中,0表示假,非0表示真,我们来看下面一段示例代码:


int main()
{
  printf("%d", 1 > 2);//在屏幕上打印0
  return 0;
}


上述的代码的原因是因为:1>2这个条件的结果是假,所以最后用0表示,最终就会打印0.


那当我们在1>2之前加一个!会怎样呢?


int main()
{
  printf("%d",! (1 > 2));//打印1
  return 0;
}


!会将表达式的逻辑值进行取反操作,只要是一个非0的数,经过这个!的操作,就会变成0,反之,表达式为0的经过!的操作,就会变成0。


2:- (负值) +(正值)


3:&(取地址符)


4:sizeof ( 操作数的类型长度,以字节为单位) ,有关sizeof,我们来看下边一段示例代码:


int main()
{
  int a = 10;
  printf("%d", sizeof(a));//4
  printf("%d", sizeof(int));//4
  //printf("%d", sizeof int); 报错
  return 0;
}


注意:用sizeof操作符时,当操作对象是关键字时括号不可以省略,但操作对象是变量时就可以省略,由此可见,sizeof并不总是需要括号的,所以,更加印证了sizeof并不是一个函数,因为函数的括号是不可以省略的。


5:~ ( 对一个数的二进制按位取反)


6: – 前置、后置–


7:++ 前置、后置++


关于前置和后置的++和–,我们看下面一段代码:


int main()
{
  int a = 10;
  int b = a++;
  printf("%d %d\n", a, b);//11 10
  b = ++a;
  printf("%d %d", a, b);//12 12
  return 0;
}


注意:


  • 后置++是先运算,再++,所以第4行先将10赋值给b,a再++变成11.
  • 前置++是先++,再运算,所以第6行,a先++变成12,再将12赋值给b。
  • 前置后置–运算符类似,这里就不作过多解释了。
  • 关系操作符:>,>=,<,<=,==,!=.


  • 逻辑操作符:&& ||


  • 条件操作符: exp1 ? exp2 : exp3


注意:条件表达式的执行逻辑是先判断exp1是否为真,为真则执行exp2,否则执行exp3。我们看下边一段示例代码:


int main()
{
  int a = 2;
  int b = 3;
  a > b ? printf("%d", a) : printf("%d", b);//用于判断a b中的较大值。
  return 0;
}


  • 逗号表达式: exp1, exp2, exp3, …expN


注意:逗号表达式会从左至右依次执行,但是整个表达式的结果是最后一个表达式的结果。例如:


int main()
{
  int a = 3;
  int b = 2;
  int c = 5;
  //逗号表达式,是从左向右依次计算的,逗号表达式的结果是最后一个表达式的结果
  int d = (a+=3, b=5, c=a+b, c-4);
  //      a=6    b=5  c=11   7
  printf("%d\n", d);
  return 0;


所以这段代码最终打印 7


11.总结


本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!


相关文章
|
C语言
初识C语言_Part 2(零基础超详解!)(二)
初识C语言_Part 2(零基础超详解!)
|
存储 编译器 C语言
初识C语言_Part 2(零基础超详解!)(一)
初识C语言_Part 2(零基础超详解!)
|
C语言
初识C语言_Part 1(零基础超详解!)(一)
初识C语言_Part 1(零基础超详解!)
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
9天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
26 6
|
29天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
35 10
|
23天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
28天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
54 7
|
28天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
30 4
|
1月前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。