在使用代码的时候使用了 gcc 即编译代码,这个过程编译器只进行语法的检查,只要没有语法错误就不会报错,也就是说 编译器只看语法不管逻辑。第二部分的./a.out 这部分则是只属于逻辑问题的检查。若是报错则是程序的逻辑出现问题。
eg: 与数学中学到的一样,算数运算 / 除法的除数不能为 0
取余也同理 % 的除数也不能为 0
(注意 : %N 运算的结果的范围是【0 ~ N - 1】
运算结果的符号则取决于左操作数,即被除数是正数,结果为正,被除数是负数,结果为负)
怎么产生随机数字?
工具 --- c语言相关函数库提供的函数(function- 功能)
random();
long int random(void); 函数原型
功能:
调用一次,返回一个随机数
------------伪随机
srandom(unsigned int seed );
功能:
给random 函数提供种子值,random函数会根据种子值的变化产生新的随机数
提供一个时间值:
time_t time(time_t *tloc);
该函数返回的是一个时间的秒数 --使用时需要头文件#include<time.h>
eg; time_t time = (NULL);
强制类型转换:
可以强制转换某些数据的类型
(类型)运算数 // 将运算数对应的类型 强行转成()中的类型
a++ and ++a
先加后用和先用后加都是只有参与到别的运算中才发挥作用
单独使用时,前置和后置效果一样
运算时必须是个左值
lvalue // left value --- 左值
左值:
int a;
a = 10; //能放在 = 左边的值,叫做左值 --- 变量
右值:
只能放在等号右边
constant // 常量
const int a ; // 此时 这个a是一个常量
lvalue (locationable value) // 可定位的 ---- 可以获取到它的地址
&a // & 表示取地址 -- 获取a对应的内存单元的编号(地址)
现在的左值和右值:
能被定位到的左值 ------------变量
不能被定位到的右值 -----------常量 以及 表达式
运算符优先级和结合性:
1、优先级
一定是先结合的
eg:
i++-3 => (i++)-3 -------> 1 - 3 = -2
优先级使用,是在不同级别的运算符混合运算时使用
2、结合性
同一优先级
1+2-3
注:
不写 printf(“%d,%d\n”,i ,i++ ); 这样的代码 因为他的顺序不确定 没有规定
eg:
i+++++i //贪心原则:
从左到右逐个字符扫描,看字符对应的运算符尽可能多的结合成c的运算符
上式如下分解开 这个程序会报错 因为++ 在使用的时候对象必须是一个左值,在这里的 i++却是一个右值,所以程序运行失败
【 (i ++ )++ 】 + i
++i 比 i++ 效率更高 因为不用产生临时的空间存储
------------------------------------------------------------------------------------------
赋值运算符:
=
eg:
int a;
a = 10 ; //赋值运算
int a = 10 ; //这个一般不当作赋值运算,只当作初始化
不同精度类型之间的混合数值赋值时
长类型=>短类型 此时高位截段 ---->只取字节范围内的后几位数据,将高位的数据全部截断
短类型=>长类型 此时 有符号的短类型------>符号位扩展
无符号的短类型------>不进行补充
//高精度和低精度
float f = 1.23 ;
int a = f ;
浮点数给到整型里,会产生精度丢失现象
都算是赋值运算:
+= // a += 1 <=> a = a + 1
-=
*=
/=
%=
a+=1 //a = (a + 1)
-----------------------------------------------------------------------------------
逗号运算:
,
连接多个表达式
表达式1,表达式2,。。。。。。,表达式n
这个整体是逗号表达式
顺序求值 ,整个表达式的结果是最后一个表达式的结果
eg:int a = 1;
int b = 2;
c = (a++,a + b)