初识C语言第一话之数据类型、常量变量、字符串、转义字符与注释

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 初识C语言第一话之数据类型、常量变量、字符串、转义字符与注释

前言

大家好,欢迎来到《C语言初阶》第一篇,本篇我们将会为大家简单介绍什么是C语言、第一个C语言程序、数据类型、常量变量、字符串、转义字符、注释,让大家从零基础整体了解C语言

1、什么是C语言

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。

C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

简单来说:C语言是我们人类与计算机进行交流的语言,他可以把我们写出来的代码转化为计算机能识别的二进制指令,操作系统使用这些二进制指令让计算机来帮我们人类做各种各样的事情。


2、第一个C语言程序

#include<stdio.h>
int main()
{
  printf("hello world\n");
  return 0;
}

分析:

main:main 函数,程序的入口,一个程序有且只能有一个main函数。

printf:库函数,用来打印数据输出到屏幕上。

include<stdio.h>:include是包含的意思,stdio.h是printf库函数的头文件,使用printf必须在程序开头包含其对应的头文件。

return:main函数的返回值,这里如果程序正常结束就在返回1。

2020062310470442.png

3、数据类型

char //字符数据类型

short //短整型

int //整形

long //长整型

long long //更长的整形

float //单精度浮点数

double //双精度浮点数

注:C语言当中没有字符串类型

每种数据类型的大小:

#include <stdio.h>
int main()
{
  printf("%d\n", sizeof(char));      //1
  printf("%d\n", sizeof(short));     //2
  printf("%d\n", sizeof(int));       //4
  printf("%d\n", sizeof(long));      //4
  printf("%d\n", sizeof(long long)); //8
  printf("%d\n", sizeof(float));     //4
  printf("%d\n", sizeof(double));    //8
  printf("%d\n", sizeof(long double)); //8
  return 0;
}
}

2020062310470442.png

为什么要有这么多的数据类型:为了更加丰富的表达生活中的各种值。

数据类型的使用:

char ch = 'w';
int weight = 120;
int salary = 20000;

有基础的同学可以阅读我另外一篇文章,里面对数据类型有全面的介绍:C语言关键字详解(一) auto、register关键字

4、常量与变量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)。

有些值是可变的(比如:年龄,体重,薪资)。

不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示。

常量

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

  • 字面常量
  • const 修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量
#include <stdio.h>
//举例
enum Sex
{
 MALE,
 FEMALE,
 SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
    //字面常量演示
    3.14;//字面常量
    1000;//字面常量
    //const 修饰的常变量
    const float pai = 3.14f;   //这里的pai是const修饰的常变量
    pai = 5.14;//是不能直接修改的!
    //#define的标识符常量 演示
 #define MAX 100
    printf("max = %d\n", MAX);
    //枚举常量演示
    printf("%d\n", MALE);
    printf("%d\n", FEMALE);
    printf("%d\n", SECRET);
    return 0;
 }

注意:

  • 枚举常量的默认是从0开始,依次向下递增1的。
  • 上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。

关于const 的详细用法,有基础的同学可以阅读我的另外一篇文章:C语言关键字详解(四)带你全面了解 const 关键字

变量

定义变量的方法

int age = 150;
float weight = 45.5f;
char ch = 'w';

变量的分类

变量分为全局变量和局部变量

#include<stdio.h>
int g_val = 10;   //全局变量
int main()
{
  int a = 20;   //局部变量
  printf("%d\n", g_val);
  printf("%d\n", a);
  return 0;
}

注:当两个局部变量变量名相同时,编译器报错;当全局变量和局部变量变量名相同时,局部变量优先。

2020062310470442.png

变量的使用

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

分析:

scanf:库函数,格式化输入,用来接受从键盘上输进来的数据。。

nums1、nums2、sum:局部变量,用来存储数据。

变量的作用域和生命周期

作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用

的。而限定这个名字的可用性的代码范围就是这个名字的作用域。

局部变量的作用域是变量所在的局部范围。

全局变量的作用域是整个工程。

生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。

局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

全局变量的生命周期是:整个程序的生命周期。有基础的同学可以阅读我另外一篇文章,里面对局部变量、全局变量以及变量的作用域与生命周期有全面的介绍:C语言关键字详解(一) auto、register关键字

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

字符串

"hello world"

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

串。

字符串必须要注意的点:

  • 字符串的结束标志是一个 \0 的转义字符。
  • 在打印字符串和计算字符串长度的时候 \0 是结束标志。
  • \0不算作字符串内容。
  • 编译器会在字符串的末尾自动补上\0。
  • 正确理解\0是字符串结束的标志:

如何理解\0是字符串的结束标志:

题目一:下面代码,打印结果是什么?

#include <stdio.h>
int main()
{
    char arr1[] = "hello";
    char arr2[] = { 'h','e','l','l','o' };
    char arr3[] = { 'h','e','l','l','o', '\0' };
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    printf("%s\n", arr3);
    return 0;
}

2020062310470442.png

分析:

arr1 是一个字符串,它在内存中存储的是:‘h’ ‘e’ ‘l’ ‘l’ ‘0’ ‘\0’六个字符,和 arr3 一样,而’\0’是字符串结束的标志,所以以 %s 打印arr1 和arr3 的时候是hello,而arr2 的末尾没有’\0’,所以当它以 %s 去打印的时候编译器不会在字符’o’的位置停下,而是会继续往后打印,直到遇到’\0’才停止,但是我们并不知道arr2后面的内存空间存放的是什么数据,所以arr2打印出来的字符个数以及是何种字符我们是无法确定的。

题目二:下面代码,打印结果是什么?

#include <stdio.h>
#include<string.h>
//strlen:求字符串长度的库函数,返回'\0'以前的字符的个数,其头文件是 string.h
int main()
{
  char arr1[] = "hello";
  char arr2[] = { 'h','e','l','l','o' };
  char arr3[] = { 'h','e','l','l','o', '\0' };
  printf("%d\n", strlen(arr1));
  printf("%d\n", strlen(arr2));
  printf("%d\n", strlen(arr3));
  return 0;
}

2020062310470442.png

分析:

补充:strlen:求字符串长度的库函数,返回’\0’以前的字符的个数,其头文件是 string.h

这里和上面一样,strlen 求字符串长度,遇到’\0’停止,所以arr1 和 arr3都是5,而arr2 末尾没有’\o’,而我们又不知道 arr2 后面的数据是什么,所以 arr2 打印出来的是随机值。

转义字符

C语言转义字符表:

2020062310470442.png

常见转义字符的使用

#include<stdio.h>
int main()
{
  printf("hello\n");  // \n:换行,将光标移动到下一行
  printf("hello\t");  // \t:水平制表符,一次跳过四个或者八个字符
  printf("\n");
  printf("\"");       // \:将 " 的意思改变,让我们单独可以打印出 "
  printf("\n");
  printf("\'");       // \:同上,将 ’ 的意思改变,让我们单独可以打印出 ‘
  printf("\n");
  printf("%c\n", '\130');   // \:将八进制的130转化为十进制的88,再打印88对应的ASCII表上的字符 'X'
  printf("%c\n", '\x61');   // \:将十六进制的60转化为十进制的97,再打印96对应的ASCII表上的字符 'a'
  return 0;
}

2020062310470442.png

ASCII 编码表:

image.png

对字符串和转义字符的理解:

笔试真题:下面代码的输出结果是什么?

#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));
    printf("%d\n", strlen("c:\test\628\test.c"));
    return 0;
}

2020062310470442.png

分析:

第一个我们不说,直接看第二个:c:\test\628\test.c,其中 \t \62 \t 被 \ 修饰转义,看作一个字符,所以一共是14个字符,可能有很多同学会把 \628 看作一个字符,从而得出答案13,但是请注意,八进制数的最大数是7,8不属于八进制的范畴,所以 \62 是一个字符,8 是另外一个字符。

题目二:下面程序的输出结果是什么

#include<stdio.h>
int main()
{
  char s[] = "012xy\08s34f4w2";
  int i = 0;
  int n = 0;
  for (i = 0; s[i] != 0; i++)
  {
    if (s[i] >= '0' && s[i] <= '9')
    {
      n++;
    }
  }
  printf("%d\n", n);
  return 0;
}

2020062310470442.png

分析:012由于前面没有\,所以不会被转义,同时,循环结束的标志是 s[i] = 0,0是指数字0,而012中的0是字符0,所以循环继续,后面,0被\转义变成数字0,所以循环结束。

注释

注释有两种风格:

C语言风格的注释 : /xxxxxx/ ,注释方便,但不能嵌套注释。

C++风格的注释 : //xxxxxxxx ,可以注释一行也可以注释多行,也可以用 ctrl+k+c 与 ctrl+k+u 快速注释与取消注释,目前比较受欢迎。

注释的作用:可以对所写的程序进行解释说明,增强可读性。也可以对想删除或者没用、错误的代码直接注释。

#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;
}
相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
30天前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
38 1
|
1月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
C语言 程序员 编译器
|
程序员 C语言 编译器
C语言关键字、标识符和注释
一、关键字 C语言提供的有特殊含义的符号,共32个。 在Xcode中关键字全部高亮显示,关键字全部都为小写。如return、int等。 二、标识符 定义:标识符是程序员在程序中自定义的一些符号和名称。
500 0
|
9天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
25 6
|
29天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
35 10
|
22天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
27天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
54 7