c语言复习1

基础篇

对于常量来说,尽量用符号常量来代替。多用const。

对于栈和队列的相关介绍。

1.printf语法问题

printf("%d is bigger than %d",num1);

程序可以编译运行,第一个%d对应的num1的值,由于后面一个%d没有对应任何值,所以打印出的值是内存中任意值。
问题 在只用printf的情况下,如何输出连续的%和d?

printf("%%d\n");

扩展

%nd :n代表列宽长度,不足长度n,在左边不空格。
%0nd :0代表不足长度N,在左边补齐0。
%-nd :向左进行补齐。
例子

printf("%03d",12);
printf("%5.3d",6); //006  限制精度 与%05.3d等价

输出结果:
012

用%f打印十进制记数法的float和double浮点数。

%.0f和%.f 相同,表示.后面跟随一个0。

const  double  PI =  acos(-1);
printf("%.f",PI);
结果 3

相关占位符

用%e打印指数记数法的浮点数。//如果系统支持十六进制表示,可用a替换e。
用%Lf/%Le/%La来打印long double类型浮点数。
%zd打印sizeof()返回值。(C99和C11编译器可用,不支持的可以用%u代替)
\a
\b
\r
请自行阅读下面的程序

#include<stdio.h>
int main(void){
	double salary;
	printf("\aEnter your desired monthly salary:");
	printf("$____\b\b\b\b");//一般,退格是不会擦除所经过的字符
	scanf("%lf",&salary);
	printf("\n\t$%.2f   a month is  $%.2f  a year",salary,salary*12.0);
	printf("\rYeah!\n");// \r 使光标回到当前行的起始处。可以覆盖原来的内容
	return 0;
}

printf()什么时候将语句输出到屏幕上呢?printf()会将语句发送到一个缓存区(buffer)中存储,当buffer满了、遇到换行字符或者需要输入的时候,将buffer中的内容发送到屏幕或者文件中,称为刷新缓存区。还有一种刷新方法使用fflush()函数。

printf("%1.2f",number); 结果被四舍五入以两位小数输出。
在这里插入图片描述

补充:

%#x 以十六进制格式输出。例如:0x1f
%24.5s 精度限制打印字符的个数,即若字符串的长度大于5,则只取前5个字符进行输出。

问题:printf函数参数入栈的顺序。

int arr[] = {3,7,8,9};
int *ptr = arr;
*(ptr++) += 123;
printf("%d %d",*ptr,*(++ptr));

printf函数参数是从右往左压栈(从高地址向低地址进行压栈),先将++ptr所对应内存地址的存放的值进行入栈,所以运算也是从右往左进行的,符合栈后进先出的原则。结果是8 8。

—(减号) :作用是从左侧开始打印
在这里插入图片描述

#define TEST  996
printf("%10d\n",TEST);
printf("%-10d\n",TEST);

返回值问题

printf函数的返回值是打印输出函数的附带用途,通常在检查输出错误时候用到。

int return_number = printf("it is a sentence.");

字符串断行

1.连续使用多个printf函数。(不建议使用)
2.在一个语句中,使用\和【enter】键进行断行
3.用多个成对的双引号。

2.进制

C语言假定整数常量为十进制,而要用十六进制和八进制,需要加上前缀。
十进制16表示为16进制为 0x10或 0X10。
十进制16表示为8进制为 020。
八进制和十六进制数前加反斜杠,可以用来表示ASCII码中的一个字符。
例如:’\007’
使用不同的进制只是为了方便,不会影响数被存储的方式。

3.类型选取

long long占64位,long占32位,short占16位,int占16位或32位(依照计算机的字长而定)
对于整形来说,首先考虑unsigned类型。unsigned类型没有负数,可以表示更大的正数,适用于计数。

如果一个数超出了int的取值范围,但是又在long的取值范围之内,用long类型。但是使用long类型,会减慢运算速度,如非必要,请少不要用long。

注意:八进制和十六进制常量都被是为int类型,如果值太大,编译器会依次尝试使用unsigned int(u)[%u],long【%ld】,unsigned long,long long(LL或者ll),unsigned long long(ull/ULL)。

将较小的常量作为long类型对待,可以在末尾加上Lhuol(同样的也适用于八进制和十六进制)。
例如,在int为16位,long为32位的系统中,会把7作为16位存储,把7L作为32位存储。

short类型,可以使用h作为前缀。
%hd可以表示十进制short类型的数值。
C语言会把short类型的值转化为int类型,因为int类型被认为处理整数类型最高效的类型。
修饰符h可以将较大的整数截断为short类型。

C语言把字符常量看为int类型,而不是char类型。
用%d打印char类型的值的时候,打印的是该字符对应ASCII码值,为整数
例子:
在int为32位,char为8位的ASCII系统中,有以下代码:

char  grade = 'FATE';

这样的类型赋给char类型的grade,只有最后8位有效。因此grade的值为’E‘。

特别的,在C99中,double的输入需要用%lf,输出必须要用%f。
默认情况下,编译器认为浮点常量为double型。
有后缀L或者l的浮点数为long double类型。
C99标准增添了一种新型的浮点表示格式,用十六进制表示浮点常数。
0xa.1fp10 p和P分别代替e和E,用2的幂代替10的幂。
注意,并不是所有的编译器都支持C99这一标准

double x = 1/3;   //这个是整形相除,得到的结果就是0,0再转化为double,还是
double y = 1.0/3; //这个就不再解释了

还有一个特殊的浮点值NaN。(not a number)。比如,给acos()函数输入大于1的数,会返回该类型的浮点数。

复数与虚数
float_Complex,double_Complex,long double_Complex。
float_Complex类型的变量两个float类型的值,分别表示复数和实数。

4.数值溢出问题

一般情况:当数值超出该类型所能表达的最大值的时候,会重新从起点开始。
特殊值
在limits.h的头文件中定义了INT_MAX INT_MIN,具体参考表下
在这里插入图片描述
同样的,在float.h也定义了一些明示常量
在这里插入图片描述

5.转义

\0oo //八进制数值,oo必须为0-7中间的数字
\xhh //十六进制,hh必须为0-f之间的数字
例子:如果要在屏幕输出 “b \ is a number.’’,则代码应该这么写

printf("\"b \\ is a number .\" \n");

浮点类型表示 1e+10; 正号可以省略。
float类型的数字通常只能按指数比例缩小或放大的6或者7位。
常量所对应的类型以及说明
在这里插入图片描述

字符串

1.char name[40]; 数组连续占内存40个字节,每个字节存储一个字符。

name = "JIN ";//字符串是双引号,并且以'\0'结尾。所以如果要存储40个字符,要开辟41个字节大小的内存空间。

int size = sizeof(name); // 求占内存多少字节,函数以字节位单位。

int length = strlen(name);//求字符串长度,不包括\0这一个字符。

也可以用define来声明符号常量。
#define NAME value

注意
sizeof 和 strlen 的返回值类型位unsigned 或则 unsigned long 类型。
C语言规定,sizeof的返回值类型是size_t类型。所以可以很清楚的看到,size_t是上面两种类型的别名。可用typedef。

直接用printf()输出,可以用%zd进行转换说明(C99和C11)。如果不支持可以用%u或者%lu。

scanf

2.scanf()只会读取字符串中一个单词,换句话说,遇到第一个空白(空格、制表符或者换行符)就不再读取输入。

%10s 最大字符宽度。功能类似于截取字符串前多少位字符。

	char name[10];
	scanf("%3s",name);
	printf("%s",name);

scanf("%d,%d",&num1,num2);
这种格式下输入第一个数字之后要紧跟一个英文的逗号,(注意英文)后面的数字可以紧跟也可以不紧跟,因为scanf函数会忽略数字前面的空白。
特例
对于%c来说,以下两个代码又不一样的功能。

1.	scanf("%c",  &ch);
2.	scanf("%c",&ch);

语句1的读取是从空白字符开始读取。
语句2的读取是从非空白字符开始读取。

返回值问题。
当读到文件的结尾的时候,会返回EOF,通常EOF被定义为-1。

优先级

一般情况下,单目运算符的优先级要高于双目运算符。

x*y++;//等价于x*(y++)

year%4==0&&year%100!=0||year%400==0;
//等价于  (year%4 == 0 && year%100 != 0)||year%400 ==0;
! 的优先级高于 && 高于||
  • 12
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值