1.第一个C语言程序
#include <stdio.h>
int main() {
printf("hello world");
return 0;
}
输出结果
PS D:\04_Dev\05_C\01数据类型与语句\output> & .\'01_first.exe'
hello world
1.1关键字
c语言已经定义好的名字,直接拿过来用即可
1.1.1 数据类型相关的关键字
作用:用来定义变量类型
char,short ,int ,long,float,double
struct,union,enum,signed,unsigned,void
-
char, 字符型,用char定义字符型变量,占用1个字节
// 占用1个字节,即8个位 // 有符号: -2^7 ~ 2^7 -1 ,即 -128 ~ 127 // 无符号: 0 ~ 2^8 -1 ,即 0 ~ 255 char ch1 = 'a'; // 正确,只能表示一个字符 char ch2 = '1223' // 错误,字符型变量不能表示多个字符
-
short,短整型,用来定义短整型变量,占用2个字节
// 占用2个字节,即16位,表示范围 // 有符号: -2^15~ 2^15-1,即 -32768~32767 // 无符号: 0 ~ 2^16-1,即 0 ~ 65535 short int a = 11;
-
int ,整型,用来定义整型变量,占用4个字节
// 占用4个字节,即32位,表示范围 // 有符号: -2^31~ 2^31-1,即 -21亿 ~ 21亿 // 无符号: 0 ~ 2^32-1,即 0 ~ 42亿 int a = 12;
-
long,长整型,用来定义长整型变量,32位(及32位以下)的机器占用4个字节,64位的机器占用8个字节。
long a = 12;
-
float,浮点型,用来存储浮点型数据,占用4个字节
float a = 3.8;
-
double,双浮点型,用来存储双浮点型数据,占用8个字节
double a = 3.8;
-
signed,有符号数据,用来定义有符号的数据,代表数据可以保存正数,也可以保存负数;
// 用来修饰char,int,short,long // 默认情况下省略,因为默认就是有符号的数据 signed int a = -10;
-
unsigned,无符号数据,只能保存正数和0
// 用来修饰char,int,short,long unsigned int a = 0;
-
void,空类型的关键字
// void是用来修饰函数参数或者返回值,代表函数没有参数或者没有返回值 void func(){ }
-
struct,与结构体有关的关键字,用来定义结构体类型
-
union,与共用体有关的关键字
-
enum,与枚举相关的关键字
// 测试数据类型占用的空间大小
#include <stdio.h>
int main() {
char a;
short b;
int c;
long d;
float e;
double f;
printf("char -> %d\n",sizeof(a));
printf("short -> %d\n",sizeof(b));
printf("int -> %d\n",sizeof(c));
printf("long -> %d\n",sizeof(d));
printf("float -> %d\n",sizeof(e));
printf("double -> %d\n",sizeof(f));
return 0;
}
输出结果:
char -> 1
short -> 2
int -> 4
long -> 4
float -> 4
double -> 8
1.1.2 存储相关的关键字
register、static、const、auto、extern
-
register
register是寄存器的意思,用来修饰的寄存器变量。即在编译的时候,告诉编译器这个变量是寄存器变量,尽量将其存储空间分配在寄存器中。
注意:
- 定义的变量不一定真的存放在寄存器中(当寄存器空间不足时,是不会存放数据到寄存器的)
- cpu取数据的时候去寄存器中拿数据比从内存拿数据要快
- 因为寄存器比较宝贵,所以不能定义寄存器数组
- register只能修饰字符型和整型数据,不能修饰浮点型数据
- 因为register修饰的变量可能在寄存器中,也可能在内存中,所以不能对寄存器变量取地址,因为只有内存的中的数据才有地址。
register char ch; register short int b; register int c; register float d;
-
static
static可以修饰全局变量、局部变量和函数
-
const
const是常量的意思,用来修饰只读的数据
const a = 111; // 赋初始值为111后,a就不能被修改了。
-
auto
这个变量基本不用了
-
extern
一般用于函数和全局变量的声明
1.1.3 控制语句相关的关键字
if ,else, break,continue,for,while,switch,case,goto,default
-
条件控制语句
if else switch case default
-
循环控制语句
for while do goto
-
辅助控制语句
break continue
1.1.4 其他关键字
sizeof,typedef,volatile
-
sizeof
用来计算变量数组占用的存储空间大小(字节数)
int a = 10; int num; num = sizeof(a); printf("num- %d", num)
-
typedef
重命名数据类型名,给一个已有的类型,重新取一个类型名
unsigned short int a = 10; // 1. 用想取名的类型定义一个变量 short int a ; // 2. 用新的类型替代变量名 short int INT16; // 3.在最前面加上typedef typedef short int INT16; // 4. 就可以使用新的类型名定义变量了 // INT16 b 和short int b 是一个效果
-
volatile
易改变的意思;用vilatile定义的变量是易改变的,即告诉cpu每次用volatile变量的时候,重新去内存中取;保证最新的值,而不是寄存器中的备份;
volatile关键字现在较少使用。
1.2 数据类型
1.2.1 基本类型
char ,short ,int, long ,float,double
#include <stdio.h>
int main(){
// 定义一个char类型变量并赋值,使用%c输出
char a = 'w';
printf("a = %c\n", a);
// 定义short类型的变量,使用%d输出
short b = 123;
printf("b = %d\n", b);
// 定义int类型的变量
int c = 234;
printf("c = %d\n", c);
// 定义long类型的数据
long d = 2341321;
printf("d = %d\n", d);
// 定义float类型的数据,默认保存小数点后6位,四舍五入,使用%f输出
float e = 3.146625;
printf("e = %f\n", e);
// 定义double类型的数据,默认保存小数点后6位,四舍五入,使用%lf输出
float f = 2.3541646546;
printf("f = %lf\n", f);
return 0;
}
输出结果
a = w
b = 123
c = 234
d = 2341321
e = 3.146625
f = 2.354165
1.2.2 构造类型
概念: 由若干个相同或者不同数据类型组成的集合,这种数据类型被称为构造类型。
int a[10]
常量:在程序运行过程中,其值不可以改变的量;
// 整形,如100,125等等
// 实型,如 3.14,0.125f,-3.1256
// 字符型,如 'a','b'
// 字符串类型 "acas","1334"
ASCII码表
对于计算机而言,只能识别二进制数据;对于费数值型数据,如果需要用一个数据值进行标识,就需要通过ASCII码表。
#include <stdio.h>
void main(){
char ch1 = 'w';
printf("ch1 = %c ,%d\n",ch1,ch1);
}
输出结果
ch1 = w ,119
变量:其值可以改变的量
// 存储类型 数据类型 变量名 = 变量值或者常量
int a = 100
变量名定义需要满足:
- 变量名只能由字母,数字和下划线组成
- 首字母不能为数字
- 不能与关键字相同
整型数据
- 十进制数据:以正常数字1-9开头,如456;
- 八进制数据:以数字0开头,如0123;
- 十六进制数据:以0x开头,如0x1e;
实型数据
实型常量:十进制常量和指数形式;不以f结尾的为double类型,以f结尾的为float类型(如3.14f)
// 十进制常量
0.0 、0.12 、5.0
// 指数形式
123e3
实型变量:单精度型(float)和双精度型(double)
float:占用4个字节
double:占用8个字节
字符数据
直接常量:用单引号括起来,如'a','b','0'等
转义字符:使用反斜杠\
开头,后跟一个或者几个字符,如\n
,\t
等
字符变量:使用char进行定义的变量,占用1个字节的存储空间。字符值以ASCII码的形式存储在内存中。
char a = 'w';
char b = '123';
字符串常量
字符串常量使用双引号括起来,如"CHINA","爱我中华"
等
字符串常量与字符常量不同:
- 字符串常量使用双引号括起来,而字符常量使用单引号
- 每个字符串的结尾,编译器会自动添加结果标志位
\0
;如"a"
包含两个字符'a'和'\0'
1.2.3 格式化输出字符
格式化字符 | 说明 |
---|---|
%d | 十进制有符号整数 |
%ld | 十进制long有符号整数 |
%u | 十进制无符号整数 |
%o | 八进制整数 |
%x | 十六进制的整数 |
%f | float型浮点数 |
%lf | double型浮点数 |
%e | 指数形式的浮点数 |
%c | 单个字符 |
%s | 字符串 |
%p | 指针的值 |
#include <stdio.h>
void main(){
// 输出整数
int a = 100;
// 输出十进制数,用%d
printf("十进制数 a = %d \n", a);
// 输出八进制数,用%o,使用%#o,就可以看到以0开头的八进制数
printf("八进制数 a = %#o \n", a);
// 输出十六进制数,用%x,使用%#x,就可以看到以0x开头的十六进制数
printf("十六进制数 a = %#x \n", a);
// 输出浮点型数据
// 默认小数点后保留6位
float b = 3.1464561;
double c = 3132.1256456;
printf("b = %f \n", b);
printf("b = %lf \n", c);
// 输出字符
// 可以使用%c输出,也可以使用%d输出
char d = 'y';
printf("d = %c %d", d, d);
// 输出字符串
// 没有专门的变量来保存字符串,一般使用后数组保存
char e[] = "hello world";
printf("e = %s\n",e);
// 输出地址,一般地址使用16进制数表示
int f = 999;
printf("&f = %p \n",&f);
}
输出结果
十进制数 a = 100
八进制数 a = 0144
十六进制数 a = 0x64
b = 3.146456
b = 3132.125646
d = y 121e = hello world
&f = 0000004a88bff9ac
特殊格式化应用:
用法 | 说明 |
---|---|
%3d | 输出宽度为3,不足3位宽度将以空格补充 |
%05d | 宽度为5,不足的宽度以0补充 |
%-5d | 宽度为5,使用左对齐的方式 |
%.2f | 小数点后保留2位,四舍五入 |
1.2.4类型转换
数据有不同的类型,不同类型数据之间进行混合运算时,必然涉及到类型转换问题。
转换方法有两种:
- 自动转换:遵循一定的规则,由编译系统自动完成
- 强制类型转换:把表达式的运算结果强制转换成新的数据类型
自动转换原则:
-
占用内存字节数少的类型,向占用字节数多的类型转换,以保证精度不降低
-
转换方向
高 double ← float ↑ long ↑ unsigned int ↑ 低 signed int ← char,short
#include <stdio.h> int main(){ // 当表达式出现了char、short、int类型中的一种或者多种 // 参加运算的成员全部变成int类型参加运算,结果也是int类型 printf("5/ 2 = %d ",5/2); // 当表达式中出现了带有小数点的实数 // 参加运算的成员全部变成double类型参加运算,结果也是double类型 printf("5.0/ 2 = %f" ,5.0/2); // 当表达式中有有符号数,也有无符号数 // 参加运算的成员变成无符号,运算的结果也是无符号数 int a = -8; unsigned int b =7; if (a + b > 0 ){ printf("a+b >0 \n"); }else{ printf("a+b <0 \n"); } // 赋值语句中,等号右边的类型自动转换为左边的类型 int m ; float n = 5.8f; m = n; printf(" m = %d \n", m); // 强制数据转换 printf("*************\n" ); int x= 10; int y = 4; printf("w = %f \n",x / y); printf("w = %f \n", (float)x / (float)y); return 0; }
输出结果:
5/ 2 = 2 5.0/ 2 = 2.500000 a+b >0 m = 5 ************* w = 0.000000 w = 2.500000
1.3运算符
1.3.1 运算符
用运算符将运算对象连接起来,符合C语法规则的式子,称为C表达式;
1.3.2 运算符分类
1. 双目运算符:即参加运算的操作数有两个,如`a + b`
1. 单目运算符:参加运算的操作数只有一个,如`i++`或则`i--`
1. 三目运算符: 参加运算的操作数有3个,如`a > b ? a = 1 : a = 2`
1.3.3算术运算符
+ - * / += -= *= /=
1.3.4 关系运算符
> < == >= <= !=
1.3.5 逻辑运算符
- && 逻辑与
- || 逻辑或
- ! 逻辑非
1.3.6 位运算符
-
& 按位与,任何值与0得0,与1保持不变
// 主要功能就是清0 0101 1011 & 1011 0100 ---------------------------------------------------- 0001 0000
-
| 按位或,任何值或1得1,与0保持不变
0101 0011 | 1011 0100 ---------------------------------------------------- 1111 0111
-
~按位取反,1变0,0变1
0101 0011 ~ ---------------------------------------------------- 1010 1100
-
^按位异或,相同为0,不同为1
0101 0011 ^ 1011 0100 ---------------------------------------------------- 1110 0111
-
移位操作
>>
右移<<
左移// 右移:逻辑右移 // 高位补0,低位溢出 0101 1010 >> 3 ---------------------------------------------------- 0000 1011 // 右移:算术右移 // 高位补符号位,低位溢出 1010 1101>> 3 ---------------------------------------------------- 1111 0101
1.3.7 条件运算符
() ? () : ()
// A ? B : C
// 如果A成立,执行B
// 如果A不成立,执行C
// 相当于
if (A){
B
}else{
C
}
1.3.8 逗号运算符
(... ,... ,...)
// A = (B,C,D)
// B ,C ,D依次执行,最终A的值为D返回的值
#include <stdio.h>
int main(){
int a = 10,b = 20;
int c;
c = (a += 10,b += 10,a += b);
printf("a = %d,b = %d,c = %d",a,b,c);
return 0;
}
输出结果:
a = 50,b = 30,c = 50
1.3.9 自增自减运算符
// 1. ++i 或者 --i
// 2. i++ 或者 i--
#include <stdio.h>
int main(){
int a = 10;
int b,c;
b = a++;
printf("b = %d\na = %d\n",b,a);
c = ++a;
printf("c = %d",c);
return 0;
}
输出结果:
b = 10
a = 11
c = 12
1.3.10 运算符号优先级
1.4 控制语句
1.4.1 if 语句
if- else
,if - else if - else
#include <stdio.h>
int main(){
int a =100;
if (a> 50){
printf("a >50");
}else if(a ==50){
printf("a ==50");
}else{
printf("a <50");
}
return 0;
}
输出结果:
a >50
1.4.2 switch 语句
switch case
switch (表达式) { // 表达式只能是字符型或者整型(short,int,long)
case 常量表达式:
语句1;
break; // 每一个case后面都要加break,不然不会跳出,会继续执行后面语句块,直到break为止
case 常量表达式:
语句2;
break;
default:
语句3;
break;
}
#include <stdio.h>
int main()
{
int a = 100;
switch (a)
{
case (50):
printf("a=50");
break;
case (100):
printf("a=100");
break;
default:
break;
}
return 0;
}
输出结果:
a=100
1.4.3 循环控制语句
for 循环
for (表达式1;表达式2;表达式3){
语句块
}
执行顺序:
- 先执行表达式1,再执行表达式2;如果表达式2成立,则执行语句块;
- 语句执行完毕后,执行表达式3;然后再执行表达式2;
- 如果表达式2成立,继续执行语句块;依次循环,直到表达式2不成立为止;
#include <stdio.h>
int main()
{
int i ;
int sum = 0;
for (i = 1; i<= 100; i++){
sum += i;
}
printf("1+2+3+...+100 = %d",sum);
return 0;
}
输出结果:
1+2+3+...+100 = 5050
while循环
while
和do while
,后者就不记录了,直接使用while
就行了。
while(条件表达式){
语句块
}
#include <stdio.h>
int main()
{
int i = 1;
int sum = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf("1+2+3+...+100 = %d", sum);
return 0;
}
输出结果:
1+2+3+...+100 = 5050
goto循环
goto主要用于再一个函数里面实现代码的跳转;
由于goto跳来跳去,平时减少使用,以免造成逻辑混乱。
#include <stdio.h>
int main()
{
int i = 1;
int sum = 0;
JOOP:
sum += i;
i++;
if (i<=100){
goto JOOP;
}
printf("1+2+3+...+100 = %d", sum);
return 0;
}
输出结果:
1+2+3+...+100 = 5050
标签:02,输出,short,16,int,float,数据类型,char,printf From: https://www.cnblogs.com/hasaki-yasuo/p/18017624