C 语言基础知识

单词

关键字、标识符、常量、运算符、分隔符、注释符6种。

关键字(• 关键字必须用小写字母表示)

在这里插入图片描述

标识符(identifier)

用户自己定义的一组字符,用于表示程序中的变量、数组、函数等的名称。

组成规则:

  1. 字母和数字以及下划线(_)组成。
  2. 以字母和 下划线(_)开头。
  3. 长度不超过32个字符。
  4. 不能和关键字同名。
  5. 系统区分大小写字母,即“大小写敏感”
  6. 在这里插入图片描述

字符:

C语言最基本的元素,用来构成C语言中进一步的语法成分,例如标识符、关键字等等。
在这里插入图片描述

数据类型

数据类型不同:

  1. 数据的外部表示方式和内部存储方式不同;
  2. 表示的范围和精度不同;
  3. 对数据的处理方式不同。
  4. 在这里插入图片描述

基本数据类型及其长度

在这里插入图片描述
在这里插入图片描述

常量

整型常量、浮点型常量、字符型常量、字符串常量。

整型常量

!!! 单独写一个0其实是一个八进制常量。
十进制有正负,八进制没有正负,
在这里插入图片描述

要明示地将一个值转换为 integer,用 (int) 或 (integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。您还可以通过函数intval() 来将一个值转换成整型。

整型常数的后缀:在16位字长的机器上,基本整型的长度也为16位,因此表示的 数的范围也是有限定的。

  • 十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。
  • 八进制无符号数的表示范围为0~0177777。
  • 十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。
    如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。

变量(Variables)

变量的声明必须放在变量使用之前,就是放在函数体的开始部分。
4. 变量赋初值:变量运算之前必须确保有值,可在定义同时对其赋初值

整形变量

整型变量在内存中的存放形式

原码:最高位是符号位,0代表正,1代表负
反码:正数的反码与原码相同,负数的反码是原码除符号位各位取反
补码:
正数的补码是它的原码,负数的补码是其反码再加1。

现代计算机通常是以补码形式存放带符号整数。

整型变量的分类

在这里插入图片描述
整形数据取值范围
在这里插入图片描述

实型变量

在这里插入图片描述

当运算结果绝对值大于10+38称为上溢,系统出 错。当运算结果绝对值小于10-38称为下溢,当0处 理。

字符变量

在这里插入图片描述

在C语言中,字符型数据和整型数据之间可以通用。

运算符和表达式

双目运算符

在这里插入图片描述

  1. 乘号不能省略!例如:xy是标识符,乘法形式是 x * y
  2. 整数相除结果为整数(截位取整),例如:12 / 5 的值为 2
  3. % 只能对整型或字符型数据运算,余数符号与被除数相同。 例如:
    -12 % 5 值为 -2
    1 % 2 值为 1

单目

在这里插入图片描述
自增、自减运算符的作用是使变量的值增1或减1。

• 前置运算:++a、–a,把运算符放在操作数之前,对变量先递增(或递减),即加1运算,然后参与其他运算,即先改变变量的值后使用;

• 后置运算:a++、a–,把运算符放在操作数之后,对变量先参与运算,后对变量递增(递减),即加1,即先使用后改变变量的值。

在这里插入图片描述

关系运算符(Relational Operator)和逻辑运算符

在这里插入图片描述

在这里插入图片描述
逻辑运算的结果用整型值表示。运算结果为真时,得到整型值1;运算结果为假时,得到整型值0。

在这里插入图片描述

  1. 运算符&&和||保证左边的运算分量优先得到计算,从左到右进行运算。

  2. 用&&进行表达式计算时,若第一个表达式值为“假”,则第二个表达式将不再计算;同 理用ǁ进行计算时,若第一个表达式值为“真”,则第二个表达式也不再计算。

类型强制转换

在这里插入图片描述

运算优先级

在这里插入图片描述
优先级:C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理。

结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z 则y 应先与“-”号结合,执行x-y 运算,然后再执行+z 的运算。

这种自左至右的结合 方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
在这里插入图片描述

储存

整型数据:

在内存中是以补码的形式存在。对于一个正整数来说,它的补码就是它的原码本身。对于一个负整数来说,它的补码为原码取反再加1

实型数据:

在计算机中也是以二进制的方式存储,关键在于如何将十进制的小数转化为二进制来表示。
例、12.63
首先整数部分为:1100
小数部分:0.632=1.26,得小数后第一位为1,0.262=0.52得小数的第二位为0,0.522=1.04得第三位为1,0.042=0.08得第四位为0,0.08*2得第五位,以此类推。于是得到最后的结果为1100.10100001b(省略了后面的计算)

字符型数据:

把字符的相对应的ASCII放到存储单元中,而这些ASCII代码值在计算机中以二进制的形式存放的。

函数返回值

在定义函数时,必须指明函数的返回值类型,而且 return 语句中表达式的类型应该与函数定义时首部的函数类型是一致的,如果二者不一致,则以函数定义时函数首部的函数类型为准。

#include<stdio.h>
int cube(float x)   /*定义cube()函数,返回类型为int*/
{
    
    
   float z;        /*定义返回值为z,类型为float*/
   z=x*x*x;
   return z;  /*通过return返回所求结果*/
}
int main()
{
    
    
   float a;
   int b;
   printf("请输入一个数:");
   scanf("%f",&a);
   b=cube(a);
   printf("%f的立方为:%d\n",a,b);
}

请输入一个数:4.5
4.500000的立方为:91

cube() 函数定义为整型,而 return 语句中的 z 为浮点型,二者不一致。

按上述规定,用户输入的数为 4.5,则先将 z 的值转换为整型 91(即去掉小数部分),然后 cube(x)带回一个整型值 91 回到主调函数 main()。如果将 main() 函数中的 b 定义成浮点型,用%f格式控制符输出,则输出 91.000000。

%g

%g 默认最多保留六位有效数字,包括整数部分和小数部分
%f 和 %e 默认保留六位小数,只包括小数部分。

%g 不会在最后强加 0 来凑够有效数字的位数,而 %f 和 %e 会在最后强加 0 来凑够小数部分的位数。

%f:不指定宽度,整数部分全部输出并输出6位小数。

%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。

1.把输出的值按照%e或者%f类型中输出长度较小的方式输出,仅当数值的指数小于-4或大于等于精度参数(默认值为6)时按%e(E)输出(否则按%f输出)

2.(在选择好输出格式之后)尾部的零会被缩减。

3.(在选择好输出格式之后且0被缩减后)当小数点后面有一个或多个数字时才显示小数点

  

   printf("%f\n", 0.00001);
   //0.000010
   //默认的精度为6所以%f与%e都显示了小数点后6位

   printf("%e\n", 0.00001);
   //1.000000e-005

 printf("%g\n", 0.00001);
 //1e-005
  //指数小于-4所以%g转化将其成了指数输出,并且省略掉了本该输出在小数点后面的6个零,并在之后略掉了后面的小数点。如果减少一个0让指数变为-4,则%g将会以%f的形式输出并省略掉后面无效的0.

   printf("%g\n",1234567.0);
	//1.23457e+006
   printf("%g\n",123456.0);
   //123456

//1234567的指数等于默认的精度6,故被按%e处理,而123456的指数5小于6故按%f处理。
    printf("%g\n",0.0000123456789);
	
	printf("%e\n",0.0000123456789);
输出结果为
1.23457e-005
1.234568e-005


首先%e按照默认精度显示小数点后6位,这没问题。

对于%g,它按照默认的精度6从最大位(1)开始截断,也就是1.23456。然后消0去小数点(当然这里没有)。这里的四舍五入是可能发生的,原理和用%.2f输出1.555结果是1.55而3.555结果是3.56一样,与浮点数的存储机制有关。

   printf("%.3g\n", 110.1);
  //110
  //这里因为指数2小于3,故被转化为%f,同时从右往左截取3位数输出,即110

   printf("%010.2g\n", 110.1);
   //001.1e+002
%010.2g:010的解释和上面是一样的,都是把e与+算在字宽内。因为110.1的指数为2,>=指定精度2,故被转化成1.101x100。然后2作为截取精度从右往左截取(可能是四舍五入。要做到真正的四舍五入应该使用round函数或者a = int(a*100+0.5)/100.0之类的算法,这里不多做讨论)两位数变成了1.1,最终得到1.1e+002printf("%010.2e\n", 110.1);
//01.10e+002
//%010.2e:这里用0修饰符以及10的字宽是为了提醒读者不要和数值截断混淆,因为即使这里的字宽超过了8也不会被截断。其他情况同上


   printf("%.2e\n", 110.1);
//1.10e+002
//%.2e:指点数值变为科学计数法后(即1.101x10的正2次方),然后**取小数点后两位**得1.10x10的正2次方。


   printf("%.2f\n", 110.1);
 //110.10
   //%.2f:指定小数点后精度为2,故加上一个0变成110.10。

对于一个使用%g转化说明的数值,不管其是指数小于-4或者大于等于精度参数(未指定的情况下默认为6)被转成了%e,还是不满足上述条件变成%f,都会先根据2,3进行简化。在简化后根据精度参数截取至最大有效数字位数(假如精度过大则不会补0使其强制变为精度确定的有效数字位数)。

%g运算符因为其能够自动简化输出中多余的0与小数点,常用于不指定输出格式的输出中

#include<stdio.h>
int main(){
    
    
	
	double p=123.4;
	printf("%f\n", 110.1);
	//110.100000
	//6位小数
	printf("%e\n", 0.00001);
	//1.000000e-005
	//6位小数,指数默认5位(e-005)
	printf("%12.3f\n",-p); 
	// -123.400
	//
	printf("%12.3e\n",-p);
	 // -1.234e+002
	printf("%12.3g\n",-p); 
	//-123
	printf("%g\n", 0.00001234);
	printf("%f\n", 0.00001234);
	printf("%e\n", 0.00001234);
	
    printf("%g\n", 0.0001234);
    //0.000123
    printf("%f\n", 0.0001234);
    //0.000123
    printf("%e\n", 0.0001234);
    //1.234000e-004




} 
	double p=123.4567;
//	printf("%f\n", 110.1);
//	printf("%e\n", 0.00001);
	
	
//	printf("%12.3f\n",-p); 
//	printf("%12.3e\n",-p);  
	printf("%12.4g\n",-p); 
	//      -123.5
	小数输出短,整数加小数一共四位
	printf("%12.4e\n",-p); 
	//-1.2346e+002
	四位小数。四舍五入,指数5printf("%12.4f\n",-p); 
	//   -123.4567
	四位小数。四舍五入

关于printf()

#include<stdio.h>
int main()
{
    
    
int A=43;
printf("%d\n",printf("%d",printf("%d",A)));
}

这个程序就是用了几个printf语句叠加。那么,这个程序会输出什么呢?

输出结果为“4321”
为什么呢?
一,执行第三个printf,输出A的值“43”
二,执行第二个printf,输出"printf("%d",A)“的值,在结果中对应的是"2”
三,执行第一个printf,输出"printf("%d",printf("%d",A))“的值,为"1”

由此我们看出,执行第二个printf时输出的"2"应该是"printf("%d",A)“返回值,而执行第一个printf时输出的"1"应该是第二个peintf的返回值。

那么printf的返回值到底是什么呢?

观察第二个printf的输出值和第三个printf的输出值,第一个printf的输出值和第二个printf的输出值不难发现:
printf的返回值就是输出的字符数量

第三个printf输出"43"字符数量为2,于是返回值为2,第二个printf就输出"2”
第二个printf输出"2"字符数量为1,于是返回值为1,第一个printf就输出"1"

要注意一点是:返回值是是输出的字符数量,包括数字,字母,标点符号,空格等。

例如:

#include<stdio.h>
int main()
{
    
    
printf("%d\n",printf(0,1,2,3\n”));
}

输出结果
在这里插入图片描述

第二个printf的返回值为8,包括四个数字,三个标点和一个换行符。

猜你喜欢

转载自blog.csdn.net/weixin_51552144/article/details/120799673