(学习记录)C 0002——简单的了解C语言

2024-04-13 10:08

本文主要是介绍(学习记录)C 0002——简单的了解C语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习记录 0002

  1. 简单的复习“C 0001”
  2. 变量作用域生命周期
  3. 常量
  4. 字符串转义字符注释
  5. 简单的了解“选择语句
  6. 简单的了解“循环语句
  7. 简单的了解“函数
  8. 简单的了解“数组
  9. 简单的了解“操作符

从0开始的C语言

  • 学习记录 0002
  • 0. 复习
  • 1. 变量的作用域和生命周期
    • 1.1 作用域
    • 1.2 生命周期
  • 2.、常量
    • 2.1 字面常量
    • 2.2 const 修饰的常变量
      • 2.2.0 补充
    • 2.3 define定义的标识符常量
    • 2.4 枚举常量
  • 3 字符串、转义字符、注释
    • 3.1 字符串
    • 3.2 转义字符
    • 3.3 注释
  • 4 选择语句
  • 5 循环语句
  • 6 函数
  • 7 数组
  • 8 操作符


0. 复习

详见0001

  1. main()函数

例题:
在一个项目中,添加两个源文件,分别命名为 test1 和 test2,
创建test1和test2

test1中打印0001:

int main()
{printf("0001\n");return 0;
}

test2 中打印1110:

int main()
{printf("1110\n");return 0;
}

这样编辑器可以成功运行吗?
运行结果
运行后,如上图,答案显然是不行的。

因此我们得到定义:在一个工程中可以有多个源文件,但是main()函数有且仅有一个。而且main()函数也叫做主函数,是程序的入口。

  1. 数据类型和它的使用,详见链接: C 0001.

  2. 变量和常量
    变量分为全局变量和局部变量。

局部变量:在大括号内部定义的变量叫做局部变量。如果局部变量名和全局变量名相同,一般局部变量优先。

全局变量:在大括号外部定义的变量叫做全局变量。


1. 变量的作用域和生命周期

1.1 作用域

一段程序代码中所用到的变量并不是总是有效的,而限定这个变量的可用性的代码范围就是这个名字的作用域。
局部变量的作用域是变量所在的局部范围。
全局变量的作用域是整个工程。

例如:在源文件test2中创建一个全局变量g_val ,在test1中可以使用吗?
创建全局变量
打印全局变量
如上图,是否在test1中可以打印出2021呢?
未定义全局变量
运行后,显示未定义标识符“g_val”。原因是在test1中没有声明这个变量,所以用extern声明一下。
声明并打印
如图,用extern声明后,就可以正常使用在其他源文件的任意地方。

1.2 生命周期

变量的生命周期是指变量的创建到变量的销毁之间的时间段。
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。

int main()
{{int a = 100;//创建一个局部变量printf("%d\n", a);//局部范围内可以使用}//出了这个范围printf("%d\n", a);//不能使用return 0;
}

2.、常量

2.1 字面常量

直接写出来的值就是字面常量。

int main()
{3.14;//浮点型的字面常量100;//整型的字面常量return 0;
}

2.2 const 修饰的常变量

int main()
{const int a = 100;a = 200;printf("%d\n", a);return 0;
}

运行后
上述代码运行结果
如图,得到结论,一个变量不能被改变时,它就具有了常属性(不能被改变的属性)

具有了常属性的变量是常量吗?

int main()
{const int n =  100;int arr[n] = { 0 };return 0;
}

运行结果为:
运行结果
因此,它不是常量,只是具有了常属性的变量,不能被修改而已。


2.2.0 补充

因为在C99标准中,引入了一个叫变长数组的概念,所以在一些编译器(如GCC)支持C99的标准时,下述代码可以正常运行,但是创建数组时不能初始化。

int main()
{const int n =  10;int arr[n];int i =0;for(i = 0 ; i < 10 ; i++){arr[i] = i;}for(i = 0 ; i < 10 ; i++){printf("%d ",arr[i]);}return 0;

2.3 define定义的标识符常量

#define MAX 100//这里可以改变常量的值
int main()
{int a = MAX;MAX = 200;//error,这里不能修改常量的值printf("a =%d\n", a);return 0;
}

运行结果
如上述代码,被define定义的MAX的常量是不能被修改的。


2.4 枚举常量

生活中一些值可以一一列举出来!比如 性别:男 女,保密。三原色 ,red,green,blue等等。这些容易列举出来的值,就可以用枚举的方法。
例如:

//enum Sex 是枚举类型
enum Sex
{//枚举的可能取值叫做枚举常量//可以在这里改变枚举常量的值MALE = 1 ,FEMALE = 2,SECRET
};
int main()
{enum Sex s = SECRET;//创建一个表示性别为保密的变量sMALE = 10;//ERROR,因为MALE是常量所以更改不了。printf("%d\n", MALE);//1printf("%d\n", FEMALE);//2printf("%d\n", s);//5return 0;
}

3 字符串、转义字符、注释

3.1 字符串

字符类型的写法是如’a’,'b’这样,由单引号括起来的单个字符。
字符串类型的写法是如"abcdef",由双引号括起来的一串字符。

例一:

int main()
{char ch[] = "abcdef";return 0; 
}

调试结果:
调试
如上图图所示,在字符串"abcdef"末尾其实还有隐藏的\0。

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

例二:

int main()
{//strlen 是库函数——求字符串长度//使用strlen函数是要引用string.h这个头文件char ch[] = "abcdef";printf("%d\n", strlen(ch1));char ch2[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(ch2));return 0; 
}

结果为:
在这里插入图片描述
为什么ch2的字符串长度是22?
在这里插入图片描述
如图:
因为在ch2中没有\0,strlen继续一直往后找\0,所以找出一堆随机值,直到找到\0,才结束统计。解决方法是在ch2末尾加入’\0’。


3.2 转义字符

例一:在屏幕上打印出“c:\test\test.c”。

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

这样可以正确打印吗?
运行结果后:
运行结果
为什么会这样呢?
因为\t是转义字符,它的意思是水平制表符。
想要正确打印,应该要在转移字符前再加上一个" \ "。

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

这样写就解决了问题。

转义字符有哪些呢?

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\’用于表示常量字符 ’
\"用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止他被解释为一个转义字符
\a警告字符,蜂鸣
\b退格符
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。如:\130
\xdddd表示2个十六进制数字。如:\x30

\ddd - ddd的8进制数字转换成10进制后的值,作为ASCII码值所代表的字符。

\xdd - xdd的16进制数字转换成10进制后的值,作为ASCII码值所代表的字符。


3.3 注释

代码中有不需要的代码可以直接删除,也可以注释掉。
代码中有些代码比较难懂,可以加一下注释文字
比如:

int main()
{//c++注释风格int a = 10;//创建整型变量a,并赋值10。/*c语言的注释风格*/int b = 20;/*创建整型变量a,并赋值10*/return 0;
}

C++的注释风格://xxxxxxxx,可以注释一行也可以注释多行。
c语言的注释风格:/* xxxxxxx */,缺陷是不能够嵌套使用

什么叫不能嵌套使用?
例如:

/*
int main()
{int a = 10;/*int b = 20;*/return 0;//没有被完全注释
}*/

如果 /* 找到了第一个对应的 */,它后边不管有没有 */,它都不再会继续注释,这就是C语言注释的缺陷。


4 选择语句

选择语句就是if……else语句(这次简单了解)。
如下:

int main()
{int input = 0;printf("要敲上万行有效代码吗(1/0)?\n");//1表示是,0表示否scanf("%d", &input);if (input == 1){printf("变大牛\n");}else{printf("普普通通\n");}return 0;
}

5 循环语句

C语言循环语句有:

  1. while循环;(这次简单了解)
  2. for循环;(之后学习)
  3. do……while循环;(之后学习)
  • while循环
int main()
{int line = 0;printf("好好学习\n");while (line <= 20000){printf("努力敲代码:%d\n",line);line++;}if(line>20000)printf("变大牛\n");return 0;
}

6 函数

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

int Add(int x,int y)
{//return x + y;int z = 0;z = x + y;return z;
}
int main()
{int num1 = 0;int num2 = 0;int sum = 0;//输入scanf("%d %d", &num1, &num2);//计算//sum = num1 + num2;sum = Add(num1, num2);//输出printf("%d\n", sum);return 0;
}

7 数组

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

int main()
{char arr1[5] = {'a','b','c'};//字符数组int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };//整形数组//打印字符数组int i = 0;while (i < 3){printf("%c ", arr1[i]);i++;}//倒序打印整形数组int n = 9;while (n >=0){printf("%d ", arr2[n]);n--;}return 0;
}

8 操作符

算数操作符有: + - * / %
移位操作符有:>> <<
位操作符有:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>= <<=

-算数操作符的加、减、乘直接使用就可。

  • 做除法时,如果得到的商如果是小数时,被除数或者除数要写成小数。
int main()
{float a = 5.0 / 2;printf("%f",a);return 0;
}
  • % - 取模得到的值是余数
    比如 7 / 2 余 1(如图)
    运行结果
  • 移位操作符
    右移操作符(下次了解)
    左移操作符(如下图)
int main()
{int  a = 6;int b = a << 1;//移动的是二进制位//int是4个字节,一个字节是8个bit位,所以int有32个bit位//00000000000000000000000000000110 == 6 == a//向左移动一位后//00000000000000000000000000001100 ==12 == b return 0;
}

这篇关于(学习记录)C 0002——简单的了解C语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899840

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl