c语言入门
#include<stdio.h> //头文件
#include<math,h>//库函数
#include<stdlib.h> //printf("puase");暂停的意思
void main(){ //主函数,{函数体}
int a=1;//定义整型
double b=1.2;// 定义浮点
char num='w';//定义字符
char name[]="wangxp";//定义字符串
printf("a=%d,b=%.1f,num=%c,name=%s\n",a,b,num,name);//输出long ld
}
整型:short int long;
浮点型:float单精度 双精度double
字符型:char
构造类型:数组(表示字符串), 结构体struct 共用体 union 枚举类型enum
指针类型 存放地址
空类型 void
整数类型
char 1字节 signed int(int)有符号 unsignedint(无符号)2或4字节
short 2字节 long 4字节
printf(“int的字节数=%d”,sizeof(int));//显示int字节数
1Bit(字节)=8bit
浮点类型
表示小数
float 6位小数 4字节 double 15小数 8字节
小数付给float需要在后面加f
float d1=1.1f
double d6=5.12e2 (等价512)
输出%f 默认保留6位小数
字符类型
单引号引起来 允许使用转义字符‘\t’ 输出对应的ASCII码 char也可以进行计算
布尔类型
0表示假,非0表示真。
#include<stdio.h>
int main(){
int pass=0;
if(pass){
printf("%d",pass);
}
else pass=1;
printf("%d",pass);
}//输出的结果为1
c语言宏定义
#include<stdio.h>
#define Bool int
#define TURE 1
#define FALSE 0
int main(){
//定义布尔变量
Bool isok =TURE;//等价int isok=1
if(isok){
printf("ok");
}
}//显示ok
基本数据类型转换
自动类型转换 :进行赋值或运算精度小的自动转换精度大的
精度从低到高
short int unsignedint long unsignedlong float double longdouble
#include<stio.h>
int main(){
char c1='a';
int num1=c1;
double d1=num1;
printf("%C,%d,%f",c1,num1,d1);
} //输出 a,97,97.0000
int main(){
char c1=num1;
int num1=d1;
double d1=23.0015;
printf("%C,%d,%f",c1,num1,d1);
}//无法转换,报错
[Error] 'num1' was not declared in this scope
[Error] 'd1' was not declared in this scope
自动类型转换细节说明
-
有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型, 然后再进行计算(如int型和short型运算时,先把short转成int型后再进行运算)。
-
若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符 号,一种无符号,则转换成无符号类型
-
在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边的类型将转换为左边的类型, 如果右边变量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部 分按四舍五入向前舍入
强制类型转换
将精度高的数据类型转换为精度小的数据类型。使用时要加上强制转换符 ( ),但可能造成精度 降低或溢出,格外要注意。
#include<stdio.h>
int main(){
double d1=23.01254;
int num=(int)d1;
printf("num=%d,d1=%f",num,d1);
}//结果是 num=23,d1=23.01254
强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
#include<stdio.h>
int main(){
int num=(int)(3.5*3.5); //3.5*3.5=12.25 int(12.25)=12
int num1=(int)3.5*3.5;//3*3.5=10.5 int(10.5)=10
printf("num=%d,num1=%d",num,num1);
}
指针入门
void main(){
int num=100;
int *ptr=#
printf("num的值=%d num的地址=%p\n",num,&num);
printf("ptr的值=%d ptr的地址=%p\n ",ptr,ptr);
printf("ptr的值=%d ptr的地址=%p\n ",*ptr,*ptr);
} //*p就是指针指向num的地址 &取地址 *P的值和num一样
指针基本类型
int * float * …数组的指针 结构体指针 共用体指针等等
值传递和地址传递
默认传递值的类型:基本数据类型 (整型类型、小数类型,字符类型), 结构体, 共用体。
默认传递地址的类似:指针、数组(如果是指针,就将指针变量存储的地址,传递给 接收变量,如果是数组,就将数组的首地址传递给接收变量。)
练习题(上面知识的应用)
#include<stdio.h>
void h(){
char a[]="张三" ;
short age=23 ;
float score=76.5f;
char gender='M';
char hobby[]="打篮球";
printf("姓名\t年龄\t成绩\t性别\t爱好\n");
printf("%s\t%d\t%.2f\t%c\t%s\n",a,age,score,gender,hobby);
}
void main(){
int a;
int b;
int num1,num2,num3,num4;
printf("请输入两个数\n");
scanf("%d %d",&a,&b);
num1=a+b;
num2=a-b;
num3=a*b;
num4=a/b;
printf("两数之和=%d两数只差=%d两数之际=%d两数相除=%d\n",num1,num2,num3,num4);
if(num1%2==0){
printf("两数之和为偶数\n");
}else{
printf("两数之和为奇数\n");
}
}
常量
1)常量是固定值,在程序执行期间不能改变。这些固定的值,又叫做字面量。
2) 常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串 字面值,也有枚举常量。
3)常量的值在定义后不能进行修改
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示 十六进制,0 表示八进制,不带前缀则默认表示十进制。整数常量也可以带一个后 缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。 后缀可以是大写,也可以是小写,U 和 L 的顺序任意
85 /* 十进制 */
0213 /* 八进制 */
0x4b /* 十六进制 */ 八进制和十六进制后面解释
30 /* 整数 */
30u /* 无符号整数 */
30l /* 长整数 */
30ul /* 无符号长整数 */
浮点常量举例说明
3.14159; //double 常量
314159E-5; // 科学计数法
3.1f; //float常量
char str2[1000]="hello \
world"; //等价hello world
常量的定义
1) 使用 #define 预处理器。
//#define 常量名 常量值
#define PI 3.14 //定义常量 PI 常量值3.14
int main() {
//PI = 3.1415 PI不可修改
double area;
double r = 1.2;//半径
area = PI * r * r;
printf("面积 : %.2f", area);
getchar();
return 0;
}
2) 使用 const 关键字
//const 数据类型 常量名 = 常量值;
const double PI = 3.14;
int main() {
//PI = 3.1415 可以吗?不可以
double area;
double r = 1.2;
area = PI * r * r;
printf("面积 : %.2f", area);
getchar();
return 0;
}
const后面要加;
-
const定义的常量时,带类型,define不带类型
-
const是在 编译、运行的时候起作用,而define是在编译的预处理阶段起作用
-
define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应
#define a 1
#define b a+3
#define c a/b*3
最后输出c 应该是1/1+3*3=10
-
const常量可以进行调试的,define是不能进行调试的,主要是预编译阶段就已经替 换掉了,调试的时候就没它了
-
const不能重定义,不可以定义两个一样的,而define通过undef取消某个符号的定义, 再重新定义
-
define可以配合#ifdef、 #ifndef、 #endif 来使用, 可以让代码更加灵活,比如我们 可以通过#define 来 启动或者关闭 调试信息。
运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
-
算术运算符 (+, -, * , / , %)
-
赋值运算符 (= += -= …)
-
关系运算符(比较运算符)(比如 > >= < <= == 等等)
-
逻辑运算符 (&& 逻辑与 || 逻辑或 ! 逻辑非)
-
位运算符 (& 按位与 | 按位或 ^ 按位异或 ~ 按位取反等等)
-
三元运算符 ( 表达式 ? 表达1 : 表达2)