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

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 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)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
1月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
45 1
|
2月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
81 12
|
2月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
52 5
|
2月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
78 8
|
2月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
65 7
|
2月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
202 11
|
2月前
|
编译器 C语言
【C语言】常量的 “前缀和后缀” 大通关!
在C语言中,常量的前缀和后缀用于明确指定常量的类型和进制系统。前缀主要用于区分不同进制的数字常量,而后缀则用于区分不同类型的整数和浮点数。正确使用前缀和后缀,可以提高代码的可读性和可维护性,确保编译器正确地理解和处理常量。
85 1
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3

热门文章

最新文章