单精度浮点数和双精度浮点数的区别
- 在内存中占有的字节数不同
单精度浮点数在机内占4个字节(32位),包括符号位1位,指数8位,尾数23位; 双精度浮点数在机内占8个字节(64位),包括符号位1位,指数11位,尾数52位。 - 有效数字位数不同
单精度浮点数有效数字8位, 双精度浮点数有效数字16位; - 所存的数值范围不同
单精度浮点的表示范围-3.40E+38-+3.40E+38, 双精度浮点的表示范围1.79E+308-+1.79E+308; - 在程序中处理速度不同
一般CPU处理单精度浮点数的速度比处理双精度浮点数快。
常用数据类型
类型 | 类型标识符 | 字节 |
---|
字符型 | char | 1 | 短整型 | short | 2 | 整型 | int | 4 | 长整型 | long | 4/8 | 长整型 | long long | 8 | 单精度浮点型 | float | 4 | 双精度浮点型 | double | 8 |
#include <stdio.h>
int main()
{
printf("char占用的字节大小:%d\n", sizeof(char));
printf("short占用的字节大小:%d\n", sizeof(short));
printf("int占用的字节大小:%d\n", sizeof(int));
printf("long占用的字节大小:%d\n", sizeof(long));
printf("long long占用的字节大小:%d\n", sizeof(long long));
printf("float占用的字节大小:%d\n", sizeof(float));
printf("double占用的字节大小:%d\n", sizeof(double));
return 0;
}
注:C语言规定sizeof(long)>=sizeof(int) ,因此long类型占用的字节数可以为4,也可以为8,具体取决于平台。
计算机中的单位
bit–比特位 byte–字节 kb mb gb tb pb
变量与常量
变量
全局变量–定义在代码块({})之外的变量; 局部变量–定义在代码块({})内部的变量; 局部变量和全局变量的名字不要相同,容易误会,产生bug;当局部变量和全局变量的名字相同的时候,局部变量优先; 若是在一个.c文件中的全局变量需要在另一个.c调用时,需要用extern 声明外部符号。
变量的作用域和生命周期
作用域
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的 而限定这个名字可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
常量
C语言中的常量和变量的定义形式有所差异。 C语言中的常量分为以下几种:
- 字面常量
const 修饰的常变量#define 定义的标识符常量- 枚举常量
enum
字符串+转义字符+注释
字符串
"hello world!\n" 这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个\0 的转义字符。在计算字符串长度的时候\0 是结束标志,不算作字符串内容。
#include <stdio.h>
int main()
{
char arr1[] = "wednesday";
printf("arr1=%s\n",arr1);
char arr2[] = {'w','e','d','n','e','s','d','a','y'};
// arr2中字符末尾没有结束标志,只有搜索到\0时计算机才认为字符串结束。
printf("arr2=%s\n", arr2);
char arr3[] = { 'w','e','d','n','e','s','d','a','y','\0'};
printf("arr3=%s\n", arr3);
return 0;
}
循环语句
while语句 for语句 do ... while语句
不借助第三变量交换两个变量
方法一
#include <stdio.h>
int main()
{
// 交换两个整型变量
int a = 3;
int b = 5;
printf("交换前:a=%d,b=%d\n", a, b);
a = a + b; // a为a+b b还是b
b = a - b; // a为a+b b为a
a = a - b; // a为b b为a
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
存在的问题: int-4个字节-32bit位-最大可表示数2147483647 若a或b的数值较大的时候,会存在溢出问题!!!
方法二
#include <stdio.h>
int main()
{
// 交换两个整型变量
int a = 3;
int b = 5;
printf("交换前:a=%d,b=%d\n", a, b);
// ^:按(二进制)位异或
a = a ^ b; // a为110,b仍为101
b = a ^ b; // a为110,b变为011
a = a ^ b; // a为101,b为011
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
该方法没有使用第三变量,也不会溢出
实际编程:采用第三变量的方法,代码的可读性高,执行效率高 异或操作:可读性差,执行效率低于其他方法!
找出只出现一次的数
给定一个非空整型数组,除了某个元素只出现一次之外,其余每个元素均出现两次,找出那个只出现了一次的元素。
方法一
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i, j;
for (i = 0; i < sz; i++)
{
int count = 0;
for (j = 0; j < sz; j++)
{
if (arr[i] == arr[j])
count++;
}
if (count == 1)
printf("%d\n", arr[i]);
}
return 0;
}
暴力求解,循环次数为n^2.
方法二
#include <stdio.h>
int main()
{
// a^a=0 a^0=a
// 1^1^2^2^3^3^4^4^5=5
// 异或满足交换律
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i;
int result = 0;
for (i = 0; i < sz; i++)
{
result ^= arr[i];
}
printf("%d\n", result);
return 0;
}
循环次数为n.
原码、反码、补码
负数在内存中存储的时候,存储的是二进制补码 ;但在使用时,打印的是负数的原码 。
常见关键字
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
关键字typedef
类型定义,这里应该理解为类型重命名。
关键字register
关键字static
#define 定义常量和宏
指针
1. 取地址运算符&
2. 定义指针变量
定义指针变量的一般形式如下:
类型说明符* 指针变量名
说明:
(1)类型说明符是指指针变量所指向的变量的数据类型,称为指针的基类型,即指针的指向类型。例如:
float* fp; // fp是浮点型指针,指向浮点型变量
char* cp; // cp是字符型指针,指向字符型变量
(2)*在这里是指针声明符,表示定义的是一个指针变量。
3. 指针运算符*
解引用操作符,用于一个地址之前,表示取*后指针变量指向内存单元中的内容。
指针变量的大小
指针大小在32位平台是4个字节,64位平台是8个字节。
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(double*));
return 0;
}
结构体
由不同类型数据组成的组合型数据结构。
|