学习记录 0002
- 简单的复习“C 0001”
- 变量的作用域和生命周期
- 常量
- 字符串、转义字符、注释
- 简单的了解“选择语句”
- 简单的了解“循环语句”
- 简单的了解“函数”
- 简单的了解“数组”
- 简单的了解“操作符”
从0开始的C语言
0. 复习
详见0001
- main()函数
例题:
在一个项目中,添加两个源文件,分别命名为 test1 和 test2,
test1中打印0001:
int main()
{
printf("0001\n");
return 0;
}
test2 中打印1110:
int main()
{
printf("1110\n");
return 0;
}
这样编辑器可以成功运行吗?
运行后,如上图,答案显然是不行的。
因此我们得到定义:在一个工程中可以有多个源文件,但是main()函数有且仅有一个。而且main()函数也叫做主函数,是程序的入口。
-
数据类型和它的使用,详见链接: C 0001.
-
变量和常量
变量分为全局变量和局部变量。
局部变量:在大括号内部定义的变量叫做局部变量。如果局部变量名和全局变量名相同,一般局部变量优先。
全局变量:在大括号外部定义的变量叫做全局变量。
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;//创建一个表示性别为保密的变量s
MALE = 10;//ERROR,因为MALE是常量所以更改不了。
printf("%d\n", MALE);//1
printf("%d\n", FEMALE);//2
printf("%d\n", s);//5
return 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 | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。如:\130 |
\xdd | dd表示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语言循环语句有:
- while循环;(这次简单了解)
- for循环;(之后学习)
- 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;
}