1.常量1
知识点:
常量分类:
(1) 字面常量(直接常量):数值常量(分为整型常量和浮点型常量), 字符串常量和字符常量
(2) 符号常量
(3) 常变量
代码如下:
/*
常量分类:
(1) 字面常量(直接常量):数值常量(分为整型常量和浮点型常量), 字符串常量和字符常量
(2) 符号常量
(3) 常变量
*/
#include <stdio.h>
int main(void){
//1.整型常量
printf("%d\n", 234);
//2.浮点型常量
printf("%lf, %lf\n", 3.24, 3e-2); //3e-2代表3的10的-2次方
//3.字符串常量
printf("%s","%dabc\n"); //字符串使用的格式说明符为%s 输出:%dabc
printf("%%dabc\n"); //想在printf的格式字符串中输出“百分号”,需要再加一个百分号 输出:%dabc
//4.字符型常量 字符也是以整型的方式存储在内存中的 '0'--48 'a'--97 'A'--65 ' '--32 '\n'--10 '\0'--0
printf("%c, %d\n", 'a', 'a'); //①普通字符常量 输出a,97
//②转义字符
printf("%c, %c, %c, %c\n", '\\', '\'', '\?', '\"'); //可显的转义字符 输出:\, ', ?, "
printf("\a"); //输出一个声音 其中\a会产生声音或视觉信号
printf("1111\babc\n"); //输出:111abc 其中\b是退格符,将当前位置后退一个字符
printf("2222\r3333\n"); //输出:3333 其中\r是回车符,将当前位置滚回到本行开头
printf("4444\t5555\n"); //输出:4444 5555 其中\t是水平制表符(tab),将当前位置移到下一个tab位置上
printf("\101 \102 \103\n"); //输出:A B C 把8进制的101,102,103转成十进制为65,66,67分别对应了'A','B','C'
printf("\x41\n"); //输出:A 16进制的x41 = 4*16^1 + 1*16^0 = 65
return 0;
}
运行结果如下:
2.常量2
代码如下:
#include <stdio.h>
//1.符号常量 只存在于预编译阶段,编译阶段就不存在了,经过预编译后,全部变为字面常量
#define PI 3.14
#define ID 101
#define CH 'A'
#define S "haha"
int main(void){
printf("%lf, %d, %c, %s\n", PI, ID, CH, S); //输出3.140000, 101, A, haha
//2.常变量 c99中新增内容
const int a = 45; //常变量必须在定义的时候初始化,初始化之后其值不可以被修改
//const int b; //error 因为定义常变量未指定初值
//a = 90; //error 因为常变量的值不可以被修改
return 0;
}
运行结果如下:
3.补码
4.整型变量的存储空间及所表示的整数范围
5.整型十进制八进制十六进制的格式声明
6.整型的隐式数据类型转换
7.强制类型转换和整数常量的数据类型及转换
代码如下:
#include <stdio.h>
int main(void){
//1.定义整型变量—带符号整型—signed+整型关键字+int+变量名(其中signed和int可省)
short a = 1; //与short int a = 1; 和 signed short int a = 1; 和 signed short a = 1;等价
int b = 2;
long c = 3;
long long d = 4; //long long是c99中新增内容
//2.定义整型变量-无符号整型-unsigned+整型关键字+int+变量名(其中int可省)
unsigned short e = 5; //与unsigned short int e = 5;等价
unsigned int f = 6;
unsigned long g = 7;
//3.求一个数据类型或者数值所占的字节数-使用sizeof运算符,注意他不是个函数,一般我们习惯对它的操作加个圆括号(sizeof后如果是关键字必须加个圆括号否则报错 )
printf("%d, %d, %d\n",sizeof(short), sizeof(int), sizeof 5); //输出2,4,4
//4.整形数据输出10进制数,所使用格式声明
printf("%hd, %d, %ld\n", a, b, c); //与printf("%hi, %i, %li\n", a, b, c);等价
printf("%hu, %u, %lu\n", e, f, g);
//5.整型数据输出8进制或16进制数,所使用的格式声明
printf("%o, %x, %X, %#x, %#X\n", 123, 123, 123, 123, 123); //输出:173,7b,7B,0x7b,0X7B
//6.scanf函数中不可以使用带“#”的格式字符
scanf("%#x", &b); //随便输入一个16进制数,scanf函数会因为错误而终止。所以并未把任何值付给b,最终输出b的值还是2
printf("%d\n", b);
//7.隐式数据类型转换-长 赋 短,截断
unsigned short us = -1; //"长的"整型数据赋给"短的"整型数据时,会只将低位的几位赋给"短的"整型数据
printf("%hu, %hd\n", us, us); //输出65535,-1
//8.隐式数据类型转换 ——"无符短" 赋 "长",先把"短的"全部内容复制到"长的"低几位,"长的"高几位填0
unsigned int ui = us;
printf("%u\n",ui); //输出65535
//9.隐式数据类型转换 ——"带符短" 赋 "长",先把"短的"全部内容复制到"长的"低几位,如果"短的"是自然数,"长的"高几位填0,否则 1
short ss = -1;
ui = ss;
printf("%u\n",ui); //输出4294967295
ss = 1;
ui = ss;
printf("%u\n",ui); //输出1
//10.隐式数据类型转换 ——等长,则保留原有补码
ui = -1;
printf("%u\n",ui); //输出4294967295
//11.整型常量 ——显示数据类型转换
printf("%u,%ld,%lu\n",1U,1L,1UL); //1U ——unsigned int类型,1L ——long类型,1UL ——unsigned long类型 1,1,1
//12.整形数据的强制数据类型转换 ——(数据类型)该处的圆括号为强制数据类型转换符,是一个单目运算符
printf("%hu,%d\n",(unsigned short)-1,(int)ui); //65535,-1
return 0;
}
8.字符型
代码如下:
#include<stdio.h>
int main(void){
//1.定义字符型变量
signed char sc;
unsigned char uc;
char ch; //在vc++中,char类型的变量是signed char类型的,在其他的编译器中char类型的变量可能是unsigned char类型的
printf("%d,%d,%d\n",sizeof(sc),sizeof(uc),sizeof(ch)); //1,1,1
//2.分析下段代码的运行结果
uc = -1;
ch = -1;
printf("%d,%d\n",ch,uc); //-1,255
/*
该句相当于:
int w;
printf("%d,%d\n",w=ch,w=uc);
*/
return 0;
}
执行结果如下:
9.getchar和putchar函数
代码如下
#include <stdio.h> //该头文件有getchar和putchar函数的函数声明
void f1(void){ //从键盘读入一个字符并输出
char ch = getchar(); //返回类型为int型,返回值为用户输入的ascⅡ码,出错返回-1
putchar(ch); //putchar向屏幕输出一个字符
}
void f2(void){ //从键盘读入3个字符并输出
putchar(getchar());
putchar(getchar());
putchar(getchar());
}
int main(void){
// f1();
f2();
/*
输入boy按回车,输出boy;
输入b按回车,输出b和换行符,再输入o按回车,输出o
*/
return 0;
}
执行结果如下:
10.浮点型
代码如下:
/*
注:
(一)所有常量末尾加的数据类型转换符可以大小写不分
(二)在目前学习过的所有格式声明中只有x、e、g可以不分大小写
*/
#include<stdio.h>
int main(void){
//1.定义实型变量-当把一个"长的"浮点型教据赋给一个较"短的"浮点型变量时,可能造成精度的损失。而且在有的编译器中会出现警告
float a = 1.1F; //1.1F表示1.1是个float型数据
double b = 1.1; //默认情况下,凡是小数都是double型
long double c = 1e-8L; //1e-8L是个long double的数据
printf("%d,%d,%d\n",sizeof(1.1F),sizeof(1.1),sizeof(1e-8L)); //4,8,8
//2.实型数据在格式化输入输出时所使用的格式声明 ——默认情况下使用带F和带e的格式声明只输出小数点后6位(第7位四舍五入)
//小数形式
printf("%f,%lf,%Lf\n",a,b,c); //输出1.100000,1.100000,-0.000000
//指数形式
printf("%e,%le,%LE\n",a,b,c); //输出1.100000e+000,1.100000e+000,-1.041128E-097
//小数或者指数形式(哪一种形式简短就用哪一种形式)
printf("%g,%lg,%LG\n",a,b,c); //输出1.1,1.1,-1.04113E-097
return 0;
}
执行结果如下:
11.printf用到的格式附加字符
代码如下:
//格式声明 - % 格式附加字符 格式字符 %lf
#include <stdio.h>
int main(void){
printf("%5d\n",-12); //5表示让数据输出占5个字符,而且是正的,表示右对齐
printf("%5c\n",'a');
printf("%5s\n\n","abcd");
printf("%-5dA\n\n",-12); //-5表示左对齐
printf("%7.2lf\n",12.345);
printf("%7.lf\n",12.345); //%7.lf和%7.0lf等价
printf("%.5lf\n",12.345);
printf("%11lf\n",12.345);
printf("%-11lf\n",12.345);
return 0;
}
执行结果如下:
12.scanf函数的注意事项2
知识点总结:
scanf函数中不可以使用#,-,m.n的格式附加字符(m, n属于自然数),可以使用域宽的格式附加字符
代码如下:
//scanf函数中不可以使用#,-,m.n的格式附加字符(m, n属于自然数),可以使用域宽的格式附加字符
#include<stdio.h>
int main(void){
int a;
/* 去掉注释,输入12345678,会输出:
12345
678
说明scanf函数可以使用带域宽的格式附加字符
scanf("%5d",&a);
printf("%d\n",a);
*/
/* 去掉注释,输入12345678,会输出:
垃圾值
12345678
说明12345678全被下面的while循环接收了,scanf函数不可以使用-的格式附加字符
scanf("%-5d",&a);
printf("%d\n",a);
*/
double b;
scanf("%7.2d",&b);
printf("%lf\n",b);
char ch;
while((ch = getchar())!='\n')
putchar(ch);
putchar('\n');
return 0;
}
执行结果如下:
13.运算符2
代码如下:
#include <stdio.h>
int main(void){
int i = 1, j = 4;
//前自减运算符它表达式的值是该变量-1之后的值;后自减运算符是该变量没有-1之前的值
printf("%d, %d\n", --i, j--); //输出结果:0,4
printf("%d, %d\n", i, j); //输出结果:0,3
//printf("%d\n", --(i+j)); //error 自增自减运算符不能用于一个数值,只能用于一个变量
i = 1, j = 4;
printf("%d\n", i+++j); //出现了!未定义行为!这在不同编译器中可能出现不同结果
int a;
printf("%d\n",sizeof((double) a)); //8 (double) a是把a这个数值表达式转化成double型数据,而不是把a变量转化成double型变量
printf("%d\n",sizeof(a)); //4
return 0;
}
执行结果如下: