1.函数
1.函数返回值
返回值类型 函数名(形式参数列表)
{
函数体
}
- void可以省略return,如 void test(){…}表示没有返回值,return后面不能带返回值,return也可省略掉。
- 如果没有写返回值类型,默认是int,如sum(int a, int b) {int c = a + b;}
- 如果写了返回值类型,可以不返回任何值
2.函数注意
- 不能嵌套定义函数(不能在函数里再定义函数)
- 不能重复定义、可以重复声明
- 调用函数之前,(尤其是调用函数的定义在后面时)一定要函数声明,一般声明放在最前面
3.printf()函数
- 需要#include <stdio.h>
- 返回值:字符串的长度
笔记:
转义字符占据一个字符长度
1.\n换行 2. \t tab键 3. \” 一个双引号
4.printf函数返回的字符串常量的字符数,并非字数
5.一个汉字占据3个字符。
int e = printf("哈h\"\ta\n");
printf("e=%d\n", e);
如上代码,运行结果e=8
4. #include
- 作用:拷贝右边文件的所有内容到#include所在的位置
- 自定义的文件用””,系统自带的文件用<>
2.进制
- printf以不同进制形式进行输出
%d、%i十进制形式输出整数
%c 输出字符(char)
%p 输出地址
%f 输出小数
%o 八进制形式输出整数
%x 十六进制形式输出整数
- 2.取值范围
二进制最高位只是用来当正负符号位,因此int正数范围1~231- 1
3 类型说明符long /short/signed/unsigned int
1> signed int等价于signed 取值范围是-231 ~ 231- 1,unsigned int等价于unsigned 取值范围是0 ~ 232– 1
2> signed和unsigned的区别就是它们的最高位是否要当做符号位,并不会像short和long那样改变数据的长度,即所占的字节数。
3> short和long改变数据所占字节数,signed和unsigned改变int取值范围。
4 位运算
& 按位与
- 只有对应的两个二进位均为1时,结果位才为1,否则为0。
- 举例:比如9&5,其实就是1001&101=1,因此9&5=1
- 规律:二进制中,与1相&就保持原位,与0相&就为0
| 按位或
- 只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
- 举例:比如9|5,其实就是1001|101=1101,因此9|5=13
^ 按位异或
- 当对应的二进位相异(不相同)时,结果为1,否则为0。
- 举例: 比如9^5,其实就是1001^101=1100,因此9^5=12
- 规律:
- 相同整数相^的结果是0。比如5^5=0
- 多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6
- 0与任何整数异或仍是整数本身。
- 因此得出结论:a^b^a = b
~ 取反
对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
如~9,0000 0000 0000 0000 00000000 0000 1001取反为
11111111 1111 1111 1111 1111 1111 0110为-10
<< 左移
- 把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方
- 由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
- 9<<n计算结果等于9*2的n次方,计算效率前者要比后者高
>> 右移
- 把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方
- 为正数时, 符号位为0,最高位补0
- 为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
<span style="font-size:10px;">#include <stdio.h>
/*
使用位异或运算符交换两个变量的值
*/
int main()
{
int a = 10;
int b = 11;
// 使用位异或运算
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d,b=%d\n", a, b);
return 0;
}</span>
#include <stdio.h>
/*
用位与&运算符判断变量的奇偶性
*/
int main()
{
/*奇数末尾是1
15: 1111
9: 1001
偶数末位是0
14: 1110
10: 1010
*/
int a = 15;
a&1 == 1 // 奇数
a&1 == 0 // 偶数
/*
if (a%2) {
printf("奇数\n");
} else {
printf("偶数\n");
}*/
//a%2==0?printf("偶数\n"):printf("奇数\n");
//a%2?printf("奇数\n"):printf("偶数\n");
return 0;
}
<span style="font-size:14px;">/*
写一个函数,用来输出整数在内存中的二进制形式
*/
#include <stdio.h>
void printBinary(int number);
int main()
{
/*
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1111
9 : 0000 0000 0000 0000 0000 0000 0000 1001
-10 : 1111 1111 1111 1111 1111 1111 1111 0110
*/
//printf("%d\n", ~9);
printBinary(-10);
return 0;
}
void printBinary(int number)
{
// sizeof()返回字节数 int 占4个字节
// 记录现在挪到第几位
// (sizeof(number)*8) - 1 == 31 总共的位数-1
int temp = ( sizeof(number)<<3 ) - 1;
//<span style="font-family: Arial, Helvetica, sans-serif;"> </span></span>通过右移的方法,使二进制每一位移到最右,和1作位与运算,来获得每一位的值<span style="font-size:14px;">
while ( temp >= 0 )
{
// 先挪位,再&1,取出对应位的值
int value = (number>>temp) & 1;
printf("%d", value);
temp--;
// 每输出4位,就输出一个空格
if ( (temp + 1) % 4 == 0 )
{
printf(" ");
}
}
printf("\n");
}</span>
5 char类型
char类型占一个字节,8个bit,所以取值范围是2的8次方即
在-128~127范围内,可以当做整数来用
printf(“%d”, ‘A’); // %d 输出返回是整数类型 67,即’A’的ASCII值为10
printf(“%c”, 68); // %c输出返回是字符型,B
常见错误:
char c = '男'; 汉字占3个字节,单引号’’只能扩住单字节的字符。
char c = A;//此处A会被当成变量
char c = "A";//字符串不能给char
char c = 'ABCD';
转义字符均占一个字节数
转义字符 | 意义 | ASCII码值 |
\n | 将当前位置移到下一行开头(回车换行) | 10 |
\t | 跳到下一个TAB位置 | 9 |
\\ | 代表一个反斜线字符 | 92 |
\' | 代表一个单引号字符 | 39 |
\" | 代表一个双引号字符 | 34 |
\0 | 空字符 | 0 |
char类型可以当做整数型int来用,如下
int i = 67 + '4';//67+52=119
char c = 'c' - 10;//99-10=89
printf("%d -%c\n", i, i);//119 – w
printf("%d -%c\n", c, c);//89 - Y
6 数组
数组定义
// 简单初始化:
int ages[5] = {19, 19, 20, 21,25}; //注意是大括号{}
int a[3] = {10, 9, 6};
int a[3] = {10,9};
int a[] = {11, 7, 6};
int a[4] = {[1]=11,[0] = 7}; //较少用,指定位置赋值
int count = 5;
int ages[count];
ages[0] = 10;
ages[1]= 11;
//数组[]长度用变量定义时,只可定义,不能同时初始化。int ages[count] = {10,22,31};错误。
常见错误
int a[]; //只定义数组名,没有指定个数。编译报错
a[4] = {10,9,8,5};//没有指定数组类型,报错。
int a[5]; a = {1,2,3,4,5};//报错。只能在定义数组的同时进行初始化。
int count = 5; intages[count] = {10,22,31};//报错。如果想在定义数组的同时进行初始化,数组元素个数必须是常量,或者不写。
数组长度
由于c语言是面向程序,不是面向对象,所以数组长度不能用array.length来表示。
正确写法是:int ages[] = {10,11,13,76}; int length=sizeof(age)/sizeof(int);
内存分析
- 存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)
- 数组名的作用,用于查看元素地址
数组作为函数参数
- 数组作为函数参数,可以省略元素个数
- 数组作为函数参数,传递的是整个数组的地址,修改函数形参数组元素的值,会影响到外面实参数组。
- 数组当做函数参数传递时,会当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节。所以在函数里不能求数组的长度int length = sizeof(Array)/sizeof(int);。数组长度需要当做参数传进来。
7 字符串
多个字符组合在一起就是字符串
- “123”其实是由’1’、’2’、’3’、’\0’组成
- 字符串的输出”%s”,’\0’是不会输出的
strlen(注意中文)输出字符串的长度,不包含\0。中文占3个字符。
字符串的本质,就是多个有顺序的字符,拼接组成。
字符串数组
一维字符数组中存放一个字符串
二维字符数组可以存储多个字符串