小沈的C语言学习1——计算机基础与运算符
第一节课
运算符与数据类型
第一节课上课时,老师问了一句,你们知道在cpp里面,(sinx+x3)/2怎么写嘛
马上就有人表示,这还不简单,0.5*(sin(x)+x*x*x)不就可以了嘛
真的是这样吗?别急,让我们先来看下面这段代码
1 //表达式与语句
#include<stdio.h>
#include<math.h>
int main(){
int a,b,c;
float d,e;
a = 2;
b = pow(a,3);
d = a;
printf("整形2取立方结果为%d,整形2化为float为%f\n",b,d);
d = 2;
e = pow(d,3);
c = d*d;
printf("浮点数2取立方结果为%f,浮点数2化为整形结果为%d\n",e,c);
d = a*b;
printf("整形2,8相乘结果为%d\n",d);
printf("转化为浮点数后的a为%f",a);
}
运行结果如下:
整形2取立方结果为8,整形2化为float为2.000000
浮点数2取立方结果为8.000000,浮点数2化为整形结果为4
整形2,8相乘结果为0
转化为浮点数后的a为0.000000
我们可以看到,pow函数和将数值重新赋予新的变量的话,数值的大小是不会改变的
但是如果直接将整形相乘,得到的结果就是0
这是什么原理?
让我们看看最后一条结果,转化为浮点数后的a为0.00...?
大家不要奇怪,这其实是从c语言上古时期留下来的bug(雾),这其实是c语言的一个特性,像”*“这种运算的对象是浮点数类型的(float、double这种),如果数值是整形,那么语言就会把数值强制转换为浮点数,在这强制转换的过程中,整形的数值就会被丢失。
那为什么将整形的值赋给声明为浮点数的变量的时候数值不会变化呢?
那当然是c语言底层在这一步运算中把整形的保存形式转换为浮点数的保存形式再放到浮点数的变量名对应的内存里啦?(总之就是c语言替你内部转换好了)
函数也同理,pow函数的对象包含整形,而sin的函数很明显就不包括整形(如下图)
所以int x—>>sin(x)的结果当然也会是0啦
之后像精度丢失(float x 与 float a 相等的判断:abs(x-a)<=0.00...01)、数值溢出(signed short int b =42486 ——>>b=-23050)都体现了c语言的数据类型特点,其它还有诸如内存处理、指针控制等,都是c语言的特性,这些东西在一些高级语言中,往往是封闭了这些操作端口,帮使用者处理的(向python大佬低头.jpg)。这种特性既是c语言的的难点,也是c语言的优势,需要在接下来的学习过程中掌握的。
接下来就到正文部分了
c语言中的表达式包括算术运算、关系运算、逻辑运算和赋值运算。算数运算自然就是a+3、9-4这样子的,关系运算就是a>b、c==2这种判断运算,逻辑包括a&&b、a||b、a!这种样式的,赋值运算就是a=1这种。运算之间可以相互组合,因此可以有(k=i)<j这样子的式子存在。
1.表达式
包括+-*/和%(取商,仅限整形)这样的基本算数运算符,以及自增自减运算符:
++i --i 先自加自减再运算 i++ i-- 先运算再自加自减
2、算术运算和赋值
i+3*sina(x)-20+'f'(此处单引号'f'为字母常量代表ascii码中对应的编号,若为双引号则为字符串变量)
下面来看一段代码
#include<stdio.h> #include<math.h> int main(){ int a,b,c,d,x; x=1; a=1; d = a+3*sin(a)-20+'f'; printf("1+3*sin(1)-20+'f'的结果为%d\n(全为整形)",d); printf("'f'的数值为%d\n",'f'); c=sin(a); printf("sina的结果为%f\n",c); }
结果为:
1+3*sin(1)-20+'f'的结果为85
(全为整形)'f'的数值为102
sina的结果为0
再运行下面一段代码:
int main(){ int a; a=1; float y = 1; b = a+y; y = a+y; printf("将整形1与浮点1相加,结果的整形为%d,浮点型为%f",b,y); }
结果为:
将整形1与浮点1相加,结果的整形为2,浮点型为0.000000
那问题来了,a+y到底是什么数据类型呢?
这里使用了查看数据类型的方法
原文链接:https://blog.csdn.net/zhangzhi2ma/article/details/82463203
#include <typeinfo> #include<iostream> using namespace std; int main(){ int a = 1; float y = 1; cout<<typeid(a+y).name()<<endl; printf("%f",a+y); return 0; }
结果为
f
2.000000
可以看出数据类型的转换是"就高原则"
//强制类型转换的形式最好少用(既然少用这里就不举例了,干脆不用就好,狗头.jpg)
其它运算符列在下面,可以慢慢去van♂。
算术运算符:+、-、*、/、%
关系运算符:>、<、==、>=、<=、!=
逻辑运算符:非(!)、与(&&)、或(||)
位运算符:左移位(<<)、右移位(<<)、按位取反(~)
按位异或(^)、按位与(&)
赋值运算符:=
条件运算符:?:
逗号运算符:,
指针运算符:*,&
求字节数运算符:sizeof
3.语句和块
函数由语句组成,语句由块组成,语句可以是连接函数与表达式的枢纽。其中根据功能的不同可以分为
posted on 2020-03-04 15:41 crazyplayer 阅读(179) 评论(0) 编辑 收藏 举报