一、基础知识
1.数据类型
数据类型 | 字节大小 | |
char | 字符数据类型 | 1 |
short | 短整型 | 2 |
int | 整形 | 4 |
long | 长整型 | 4 |
long long | 更长的整形 | 8 |
float | 单精度浮点数 | 4 |
double | 双精度浮点数 | 8 |
2.变量
int a = 100;//全局变量
int main()
{
int a = 200;//局部变量
reutrn 0;
}
这里需要注意,当局部变量和全局变量同名的时候,局部变量优先使用。
3.sizeof和strlen
sizeof是一个操作符,计算的是类型或变量所占空间的大小,单位是字节(byte),而strlen是一个函数,计算的是字符串的长度,以'\0'为结束标志。
第一种是正确的定义方式,系统会默认在abc的后面加上'\0',因此sizeof的计算结果是4(算上'\0'),strlen的计算结果是3(不算'\0),而第二种定义方式如果后面不主动加上一个'\0',系统不会自动加上,因此sizeof的计算结果是3,而由于strlen计算时找不到'\0',所以无法判断出什么时候结束,故输出的结果为一个随机值(15)。
再来看下面的例子:
第一感觉是:strlen("abc") - strlen("abcdef") = 3 - 6 = -3,所以输出结果应该是'<=',但为什么打印出来的结果是'>'呢?
原因是strlen函数的返回类型是无符号整型,因此计算出来的结果-3被当成了一个无符号整型,-3在内存中是以补码形式存储的,为1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1101,此二进制数被当成一个无符号数,因此最高位1不再是符号位,所以是一个大于0的数,故输出结果为'>0'。
这里也简单介绍一下原码、反码和补码的概念,如下图。
4.转义字符
转义字符 | 释义 |
\? |
在书写连续多个问号时使用,防止他们被解析成三字母词
|
\' |
用于表示字符常量
'
|
\'' |
用于表示一个字符串内部的双引号
|
\\ |
用于表示一个反斜杠,防止它被解释为一个转义序列符
|
\a |
警告字符,蜂鸣
|
\b |
退格符
|
\f |
进纸符
|
\n |
换行
|
\r |
回车
|
\t |
水平制表符
|
\v |
垂直制表符
|
\ddd |
ddd
表示
1~3
个八进制的数字。 如:
\130 X
|
\xdd |
dd
表示
2
个十六进制数字。 如:
\x30 0
|
例如:
#include<stdio.h>
int main()
{
printf("%d\n",strlen("c:\test\628\test.c"));//程序输出14
return 0;
}
由于'\t'和'\62'被解析成一个转义字符,因此程序输出结果为14。
5.关键字static
在C语言中,static是用来修饰变量和函数的。
1.修饰局部变量 - 称为静态局部变量
2.修饰全局变量 - 称为静态全局变量
3.修饰函数- 称为静态函数
注:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
二、循环语句
循环执行语句有:while语句、for语句、do while语句
1.while语句
while(表达式)
循环语句;
例如:
在屏幕上打印1-10的数字
#include<stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
}
return 0;
}
while语句中的break和continue
break在while循环中的作用:用于永久终止循环。
continue在while循环中的作用:终止本次循环,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
2.for语句
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量的;
表达式2为条件判断部分,用于判断循环时候终止;
表达式3为调整部分,用于循环条件的调整。
例如:
在屏幕上打印1-10的数字
#include<stdio.h>
int main()
{
int i = 0;
for(i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
在for循环中也可以出现break和continue,它们的作用和在while循环中是一样的。
建议:
(1)不可在for循环体内修改循环变量,防止for循环失去控制;
(2)建议for语句的循环控制变量的取值采用“前闭后开”写法。
3.do while语句
do
循环语句;
while(表达式);
特点:循环至少执行一次,使用的场景有限,所以不经常使用。
break和continue同样也可以在do while语句中使用,作用也是一样的。
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
三、函数
1.库函数
查询工具:
http://en.cppreference.com(英文版)
http://zh.cppreference.com(中文版)
注:使用库函数,必须包含 #include 对应的头文件。
2.函数的调用
(1)传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
(2)传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
3.函数的链式访问
函数的链式访问即把一个函数的返回值作为另外一个函数的参数。
例如:
这里首先需要知道,printf函数的返回值是打印在屏幕上字符的个数,因此printf("%d",43)在屏幕上打印的结果是'43',个数是2,因此返回'2',所以就变成了printf("%d",2),于是在屏幕上接着打印出'2',个数是1,返回1;接着变成pirntf("%d",1),在屏幕上再打印出'1',所以最终的结果是4321。