C语言学习记录(三)
C语言学习记录(三)
一、知识要点(数据类型、运算符与表达式)
1、C语言的数据类型
- C语言数据结构有:基本类型、指针类型、构造类型和空类型。其中基本类型:查看书籍的22页表3-1。
- C语言的基本数据类型可以直接用来定义常量和变量,但是构造类型需要自己构造。
- C语言在处理常量和变量时,储存常量的内存单元是不能被改变的,而变量则可以改变。
2、常量
整形常量:表示一个确定的整数。
十进制整数:由0~9的数字序列构成,可加正负号。
八进制整数:必须以0开头,可加正负号。
十六进制整数:必须以0x或0X开头,可加正负号。
整数的后缀
整型常量的尾部加上L或l表示此为长整型常量。
尾部加上U或u表示无符号整数常量。
L和U可以同时使用,顺序任意。
浮点型常量:也就是实数。
十进制小数形式:由数字、小数点和正负号组成。
指数形式:由数字、字母e和正负号组成,形式为aEn,意为a*10n,其中a为十进制整数或小数,n为十进制整数。
a和n都不能省略,n必须为整数。
整数和小数部分可省略其中一个,例:.35、26.
浮点常量默认为double类型,在尾部加F可变为float类型。
实数在机内的储存形式
数符 小数部分 指数符号 指数部分
字符常量:属于ASCII码中的常量。
- 使用单引号括起来的字符,如‘a’
- 转义字符:用来控制的字符常量,以\开头,在屏幕上不显示。常用转义字符详见课本25页表3-2。特别注意,\ddd代表1~3位八进制自负,如'\012'。\xhh代表十六进制,如'\x12'。
字符串常量:字符串常量是由双引号括起来的字符序列,字符串在机内储存时末尾的一个字节用来存放\0。
符号常量机器定义:C语言提供了一种利用标识符来代表一个常数的方法,即定义符号常量。
- C语言使用#define定义符号常量,格式为
#define PI 3.14
,指PI的数为3.14。一旦定义了符号常量,之后有使用这些符号常量的地方都会被常量值取代。 - 人们习惯用大写字母来表示符号常量,用小写字母来表示变量名。
- C语言使用#define定义符号常量,格式为
3、简单变量
变量的命名
- 变量的值在程序运行过程中是可以改变的。
- 变量需要一个名字,以便对其引用。变量名以一个名字分配一个内存单元。访问变量的值,实际上是通过变量名找到相应的内存地址,然后进行访问。
- C语言中,对变量、符号常量、函数、宏、标号、文件名等命名的有效字符称为标识符。标识符由字母、数字和下划线组成,且必须以下划线或字母开头。
- 关键字不能作为变量名使用,如int这些。
变量的类型定义
- 变量的数据类型决定了该变量的取值范围、取值类型、占空间大小等。
- 变量必须先定义再使用。
变量的初始化
#include <stdio.h>
int main()
{
int i;
printf("%d\n",i);
return 0;
}
//输出了不确定值
从上述例子看出,变量定义后要初始化,不然计算机会赋予它不确定值。
在同一程序块中,不能有两个相同的变量名。
C语言中没有字符串变量类型。
4、库函数
库函数的使用方式
C语言每个库函数都在对应的某个头文件声明其函数原型,文件包含可以用预处理命令
#include
来实现。例如,数学函数的原型都在文件math.h中,如果要调用数学库函数函数可以用
#include <math.h>或#include "math.h"
来实现。C语言函数调用的格式语法为:函数名(实参列表),如果是调用无参函数,那么直接写括号就行了。
#include <stdio.h>//计算三角形面积
#include <math.h>
int main()
{
double a = 3.5, b = 4.5, c = 5.5;//a,b,c表示三角形三条边
double p, s;
p = 0.5 * (a + b + c);
s = sqrt(p * (p - a) * (p - b) * (p - c));//用劳伦公式计算面积
printf("area=%lf", s);
return 0;
}
常用数学函数
三角函数sin,cos,tan
原型:
double sin(double x );double cos(double x);double tan(double x);
功能:函数sin,cos,tan分别用于计算正弦、余弦和正切值,且参数都是代表弧度值的double函数。
#include <stdio.h>//计算sin,cos,tan的值
#include <math.h>
#define PI 3.1415926
int main()
{
double x, y;
x = 0.5 * PI;
y = sin(x);
printf("sin(%lf)=%lf\n", x, y);
x = 0;
y = cos(x);
printf("cos(%lf)=%lf\n", x, y);
x = 0.25 * PI;
y = tan(x);
printf("tan(%lf)=%lf\n", x, y);
return 0;
}
绝对值函数abs,fabs,labs
原型:
int abs(int x);double fabs(x);long labs(x);
功能:abs、fabs和labs分别用于求整数、浮点数和长整型数的绝对值,返回参数x的绝对值。
#include <stdio.h>//计算x,y,z的绝对值
#include <math.h>
int main()
{
int X,x = -1;
double Y, y = -0.234;
long Z,z = -99999;
X = abs(x);
Y = fabs(y);
Z = labs(z);
printf("%d %lf %d ", X, Y, Z);
return 0;
}
exp和pow函数
原型:
double exp(double x);double pow(double x);
功能:exp函数返回以e为底,参数x为幂的指数值ex;pow函数返回x的y次幂xy。
#include <stdio.h>//计算e的a次方和b的c次方
#include <math.h>
int main()
{
double a, b, c, A, B;
scanf("%lf%lf%lf", &a, &b, &c);
A = exp(a);
B = pow(b, c);
printf("e^%.2lf=%.2lf\n%.2lf^%.2lf=%.2lf",a, A,b,c, B);
return 0;
}
log和log10函数
原型:
double log(double x);double log10(double x);
功能:log函数返回以e为底,参数x的自然对数值lnx;log10函数则为log10x。
#include <stdio.h>//计算lnX和logX
#include <math.h>
int main()
{
double x, y, a, b;
scanf("%lf%lf", &x, &y);
a = log(x);
b = log10(y);
printf("ln(%.2lf)=%.2lf\nlog(%.2lf)=%.2lf", x, a, y, b);
return 0;
}
sqrt函数
原型:
double aqrt(double)
功能:aqrt函数返回参数x的平方根
#include <stdio.h>//计算根号x
#include <math.h>
int main()
{
double x, y;
scanf("%lf", &x);
y = sqrt(x);
printf("根号%.2lf=%.2lf", x, y);
return 0;
}
随机函数rand,srand
rand和srand函数的原型在头文件 stdlib.h中定义。函数原型:
int rand(void); void srand(unsigned int seed)
功能:rand函数返回一个值在0~RAND_MAX之间的伪随机整数,其中RAND_MAX至少为32767。srand函数用来设置随机数的起始点,参数seed是随机数种子。
#include <stdio.h>//用当前时间机器做种子,产生4个随机数
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
printf("%6d\n", rand());
printf("%6d\n", rand());
printf("%6d\n", rand());
printf("%6d\n", rand());
return 0;
}
字符输入输出函数
函数原型在头文件stdio中
字符输出函数putchar
原型:
int putchar (int c);
功能:把一个字符输出到显示屏上,其中参数c可以是字符变量或常量,也可以是代表ASCII码的整数。
#include <stdio.h>//输出单个字符
int main()
{
char c1 = 'A', c2 = 65, c3 = '\x41';
putchar(c1);
putchar(c2);
putchar(c3);
putchar('\n');
putchar(36);
putchar('3');
return 0;
}
字符输入函数getchar
原型:
int getchar (void);
功能:getchar函数从标准输入设备的输入流中获得一个字符。调用该函数时不用参数。
#include <stdio.h>//利用getchar函数输入一个字符
int main()
{
char ch;
ch = getchar();//将输入的字符赋予ch
putchar(ch);
return 0;
}
格式化输入输出函数的一般使用
格式化输出函数printf
- 普通字符在输出时按原样输出,转义字符则输出所代表的字符。
- 输出:int→%d,float→%f,double→%lf,char→%c,字符串→%s。
- 在printf函数中,可以可以控制输出数据的长度,格式为%md或%m.nlf或%ms,m表示非负整数。当m小于输出数据长度时,m将不起作用。
格式化输出函数scanf
字符输入和printf函数一样。
#include <stdio.h>//利用getchar函数输入一个字符
int main()
{
int i, j;
float x, y, z;
printf("请输入数字赋予i和j:");
scanf("%d%d\n", &i, &j);
printf("请再次输入数字赋予x、y和z:");
scanf("%f%f%f\n", &x, &y, &z);
printf("i=%d,j=%d,x=%f,y=%f,z=%f", i, j, x, y, z);
return 0;
}
程序中&i、&j中的&表示地址运算符,用于取地址。
scanf括号里双引号的符号在输入时必须要原样输入。
使用格式化输入函数scanf常见的几个问题
- scanf函数中的地址表应填变量的地址,而非变量名。
- 在用%c输入字符时,空格符和转义字符都会作为有效字符输入,从而引起错误。
- 当连续使用多个scanf函数输入数据时,会发生数据残留问题,具体操作观看本书39页。
5、运算符和表达式
C语言中的表达式是由操作符(运算符)和操作数(运算量)组合成的式子,来描述操作顺序。操作数可以是常量或者变量或者函数。并且表达式的计算将返回一个具有确定类型的值。
C运算符的种类、运算优先级和结合性
- 运算符的种类:在后面会仔细讲解。
- 优先级:初等运算符([],(),->)→单目运算符→算数运算符→逻辑运算符→赋值运算符→逗号运算符
- 结合性
- 左结合性:运算顺序先左后右,算术运算符就是左结合性。
- 右结合性:运算顺序先右后左,赋值运算符就是右结合性。
- 说明
- 相同优先级的运算符,运算次序由结合性决定。
- 各种操作符对操作数个数的要求不一样,有的是两个(双目运算符),有的是一个(单目运算符),有的还是三个。
算术运算符和算术表达式
- 算术运算符
- 五个算术运算符:*、/、+、-、%(求余)。
- 都是双目运算符,且都为左结合性。
- 算术表达式
- 求余运算%前后两个操作数都必须为整形数据,当两个操作数为正时,结果为正,如果其中一个为负时,不同的编译器结果不同。
- 整数除:结果只会显示整数部分,小数部分被舍弃,且不进行四舍五入。
- 实数除:只要两个相除数有一个是实数,那么结果就是实数。
- 各类型数值混合运算
- C语言允许整形、浮点型和字符型数据混合运算。
- 在c语言算数表达式中,如果参加运算的操作数不一致,那么将会转化为一致的类型后在进行运算,且是低级转化为高级数据,规则为:char,short→int→unsigned→long→(float)double→long double
- 算术运算符
赋值运算符和赋值表达式
赋值运算符
- C语言中的简单赋值运算符是=,而等于是==,切莫搞混。赋值表达式是变量名=表达式,意思是把表达式存在变量名地址所指的存储单元中。
- 赋值运算符左侧的操作数称为左值,它必须指明一个确定的可存储位置。如a + b =3是错误的。
- 赋值运算符具有右结合性。
复合赋值运算符
- C语言规定可以使用十种运算符:*=、/=、%=、+=、-=、>>=、<<=、&=、^=、|=。这些运算符优先级都相同,也都是右结合性。他们都高于逗号运算符,低于其他所有运算符。
- 复合赋值运算符的含义:a+=5指的是a=a+5,其他的也是这样。
赋值类型转换
- 将浮点型变量赋给整型变量时,舍弃小数部分。
- 将double数据赋给float数据时,截取前面七位有效数字,存到float中去,反之则扩展到十六位。
- 当长整型数赋给短整型变量时,截取低位传送,反之则扩展。
强制类型转换
此转换符可改变数据符类型,格式为:(类型名)表达式。如(double)i
#include <stdio.h>\\精度损耗问题
int main()
{
double x = 3.6;
int i;
i = (int)x;
printf("x=%lf,i=%d", x, i);
return 0;
}
增量运算符和增量表达式
- 增量运算符(单目运算符)有++,--。
- 前缀运算:先增值,后运算:i=1;j=++i;
- 后缀运算:先运算,后增值:i=1;j=i++;
- 运算注意事项
- ++和--只能用于变量,不能用于常量或表达式。
- 此运算符结合方向是右结合性。
- 建议不要连续使用多个增量运算符,不然别人很难搞懂你写的是啥。
关系运算符和关系表达式
- 关系运算符
- C语言中有六个关系运算符:<,<=,>,>=,==(等于),!=(不等于)。
- 这些都是双目运算符,且都是左结合性,关系运算符的级别低于算术运算符,高于赋值运算符。
- 关系表达式:关系表达式的值是一个逻辑值,只有真和假两种。
- 如果关系表达式成立,那么真值为真,C语言中用1表示。
- 反之则真值为假,用0表示。
- 关系运算符
逻辑运算符和逻辑表达式
逻辑运算符
- C语言有三个逻辑运算符,他们是:&&(逻辑与)、||(逻辑或)、!(逻辑非),其中&&和||是双目运算符,!是单目运算符;前两者为左结合性,后者为右结合性。
- 有一种表归纳了逻辑运算的规则,叫真值表(学过离散就知道,不必多说)
逻辑表达式
逻辑表达式的值是一个逻辑值(真和假)在判定一个量是否为真或假时,C语言规定以0表示真,以非0表示假。比如a=3是真。
判断x是否属于区间[a,b]在C语言中不能写成a<=x<=b,应当写成a<=x&&x<=b。
不完全计算
在一个&&的表达式中,若&&左端为假,则不再计算另一端,该值肯定为假。
在一个||表达式中,若||左端为真,则不再计算另一端,该值肯定为真。
#include<stdio.h>//不完全计算问题
int main()
{
int a, b, c, d;
a = 0;
b = 1;
c = a++ && b++;
d = a++ || b++;
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
return 0;
}
条件运算符和条件表达式
格式为表达式1?表达式2:表达式3。这是C中唯一一个三目运算符,意思是如果表达式1的值为真,那么取表达式2的值,否则取表达式3的值。
这三个表达式类型可以互不相同,当表达式2和表达式3的数据类型不同时,则最后的值转化为两者中类型高的数据类型。
#include<stdio.h>//比较两个数大小
int main()
{
double a, b, max;
printf("Please input two real numbers:");
scanf("%lf%lf", &a, &b);
max = (a > b) ? a : b;
printf("max=%lf\n", max);
return 0;
}
逗号运算符和逗号表达式
C语言中逗号有时也是运算符,称为逗号运算符,也称为顺序求值运算符,用于将多个表达式连接起来,格式为表达式1,表达式2,……表达式n。
求值过程是:从左到右依次对各个表达式求值,只取最后一个表达式的值。逗号表达式的优先级是最低的。
#include<stdio.h>//逗号表达式的实例
int main()
{
int i, j;
j = (i = 2, i++, i++);
printf("i=%d,j=%d\n", i, j);
return 0;
}
位运算符
位运算指的是对二进制数的位进行运算,C语言中,有六种位运算符,其优先级从高到低为:~、<<、>>、&、^、|。注意,位运算符只适用于字符型和整数型数据,对其他数据类型不管用。
按位与运算符(&)
- 就是将两个数的二进制位都相与。
- 按位与通常用来对某些位清零或保留某些位。比如把整数a的高八位清0,保留低八位:a&255(255的二进制位(0000 0000 1111 1111)。
按位或运算符(|)
- 就是将两个数二进制相或。
- 常用来把数据的某些位定值为1。比如把整数a的低八位定值为1,高八位不变,可做a|255运算。
按位异或运算符(^)
就是将两个数相异或。
可以实现两个值的交换:
a=10100001,b=00000110
a=a^b;//a=10100001
b=a^b;//b=10100001
a=a^b;//a=00000110
左移运算符(<<)
- 比如a<<4就是把a的各个二进位全部左移四位。高位丢弃,低位补零。
- 对某个数左移一位相当于把这个数乘2,左移四位就是乘24。
右移运算(>>)
- 和左移差不多,右移就是除2。
#include<stdio.h>//位运算实例
int main()
{
unsigned a, b;
printf("input a number: ");
scanf("%d", &a);
b = a >> 5;
b = b & 15;
printf("a = % d, b = % d\n", a, b);
return 0;
}不同类型数据的混合运算时,会将运算对象右端对其。
求字节数运算符sizof:可以求返回运算对象所占内存空间的字节数。
2、学习心得
不得不说,c语言的数据类型确实很多,我也花了很长时间去记它,希望以后不要忘了。
C语言学习记录(三)的更多相关文章
- Go语言学习笔记三: 常量
Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...
- JavaScript学习记录三
title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 3.VUE前端框架学习记录三:Vue组件化编码1
VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...
- leveldb 学习记录(三) MemTable 与 Immutable Memtable
前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...
- C 语言学习 第三次作业总结
本次作业内容: For循环的使用 If判断语句的使用 常用数学运算表达式的使用 数学函数库中几个常见函数的使用及自我实现 将操作代码提交到coding 作业总结: For循环是C语言中一种基本的循环语 ...
- 【GO】GO语言学习笔记三
7.数组: 几乎是最常用的数据类型了... 数组就是指一系列同一类型数据 的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数 组的长度. 常规的数组声明方法: ...
- 学习iOS笔记第一天的C语言学习记录
c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 ...
- webrtc学习———记录三:mediaStreamTrack
参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...
- C语言学习第三章
写在课前,提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号! 今天主要学习掌握if...else条件结构,多重if条件 ...
- Go语言学习笔记(三) [控制结构、内建函数]
日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语 ...
随机推荐
- Ubuntu18.04安装教程
转载csdn: Ubuntu18.04安装教程_Sunshine的博客-CSDN博客_ubuntu安装教程
- Linux 下安装Nginx两种方法- yum安装 and Centos7下yum安装配置nginx与php
转载csdn: Linux 下安装Nginx两种方法- yum安装_在电脑前深思的博客-CSDN博客 Linux安装Nginx(两种方式)_HHRunning的博客-CSDN博客_linux 是否安装 ...
- 微信小程序防止多次点击提交的方法
Page({ data: { lock: false }, //表单提交 submit(){ let that = this; let {lock} = that.data; if(!lock){ t ...
- HBase架构及读写流程
HBase架构: Client 访问HBase的接口并维护cache来加快对HBase的访问 Zookeeper 1.保证任何时候,集群中只有一个活跃master 2.存储所 ...
- crypto-gmsm国密算法库
crypto-gmsm国密算法库 一.开发背景 crypto-gmsm国密算法库是国密商密算法(SM2,SM3,SM4)工具类封装,国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主 ...
- mybatis处理一对多的映射关系
实体类 package org.example.entity; import java.util.List; public class Dept { private Integer deptId; p ...
- python连接数据库系列
1.Python连接MySQL 具体详情参考:MySQL笔记 Python连接MySQL需要借助pymysql,安装pymysql pip install pymysql 1.1 pymysql连接数 ...
- Nginx基础篇(一)
(一)介绍 Nginx 是开源.高性能.高可靠的 Web 和反向代理服务器,也可以作为邮件代理服务器.而且支持热部署,即几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能 ...
- 【yum】使用新的centos 6.9系统时,遇到的Yum问题
1,不识别域名 vi /etc/yum.conf 新增: nameserver 1.1.1.1(根据实际配置) 2,Header V3 RSA/SHA256 Signature, key ID 060 ...
- canvas 学习笔记
1.利用上下文对象进行绘制画笔 var canvas=canvas.getContext('2d') 2.绘制路径 canvas.rect(30,30,300,300) 3.填充 canvas.fil ...