1.算术运算的注意点
- 强制类型转换
double a = (double)1 / 2; double b = (double)(1 / 2);// 错误写法,结果为0
- 求余运算结果的正负性取决于第一个运算数,跟后面的运算数无关
2.类型转换问题
-
2.1自动转换(隐式转换):
- 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。
- 自动转换遵循以下规则:
- 相同数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类型。系统会自动对占用内存较少的类型做一个“自动类型提升”的操作
- 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
- 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转 成long型后再进行运算。
- 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成 double型,再作运算。
- char型和short型参与运算时,必须先转换成int型。
- 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。
-
2.2强制类型转换(显示转换):
- 强制类型转换是通过类型转换运算来实现的
- 其一般形式为:(类型说明符) (表达式)
float floatValue = 10.1f; int sum = 4 + (int)floatValue ; printf("sum = %d", sum);// 输出14 // floatValue本身的值并没有改变 printf("floatValue = %f", floatValue); // 输出10.100000
3.复合赋值运算符
构成复合赋值表达式的一般形式为:
变量
双目运算符 =
表达式;
如: a *= 1 + 2;
它等效于
变量 =
变量
双目运算符
表达式;
如: a = (1 + 2) * a;
注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。
4.自增、自减运算符求值过程
- 前缀表达式:++x, --x;其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即
“
先变后用
”
,也就是变量的值先变,再用变量的值参与运算。 - 后缀表达式:x++, x--;先用x的当前值作为表达式的值,再进行自增自减1运算。即
“
先用后变
”
,也就是先用变量的值参与运算,变量的值再进行自增自减变化。
5.sizeof
- sizeof可以用来计算一个变量或一个常量、一种数据类型所占的内存字节数
- 注意: sizeof不是一个函数, 是一个运算符. (面试题)
6.逗号运算符
表达式
1
,表达式
2
,
… …
,表达式
n;
- 逗号表达式的运算过程是:先算表达式1,再算表达式2,依次算到表达式n
- 整个逗号表达式的值是最后一个表达式的值
7.关系运算符优先级
- 关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者
- 关系运算符的优先级小于算术运算符
- 例如2==3>1:先算3>1,条件成立,结果为1。再计算2==1,条件不成立,结果为0。因此2==3>1的结果为0。
- 例如3+4>8-2:先计算3+4,结果为7。再计算8-2,结果为6。最后计算7>6,条件成立,结果为1。因此3+4>8-2的结果为1。
8.三目运算符
- 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
- 条件运算符的结合方向是从右至左
·
例如:
·
max=(a>b)? a:b;
·
可以去掉括号而写为:
·
max=a>b?a:b;
·
例如:
·
a>b?a:c>d?c:d;
·
应理解为:
·
a>b?a:(c>d?c:d)
9.产生随机数
·
//
如何进行随机出拳,
借助一个stdlib.h
下一个产生随机数的函数
· // arc4random_uniform(n) 0~n-1
之间的随机的整数
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
//1.1提示用户 0代表石头; 1代表剪刀; 2代表布;
printf("亲,0代表石头; 1代表剪刀; 2代表布;输入666退出游戏!
");
//1.2设定循环让玩家可以一直玩
while (1) {
//2.0监测用户输入值的合法性
int player = -1;
while (player < 0 || player > 2) {
//2.1如果用户输入666,则退出游戏
if (player == 666) {
return 0;
}
printf("请输入0~2中的一个数:
");
scanf("%d", &player);
}
//3.利用电脑产生一个0~2的随机数
int computer = arc4random_uniform(3);
//4.定义一个变量储存两者之差
int num = player - computer;
//5.1如果player == computer,则平局
if (num == 0) {
printf("平局!
");
}
//5.2如果差是-1或者是2,玩家赢
else if (num == -1 || num == 2){
printf("我靠,你赢了!
");
}
//5.3否则电脑赢
else{
printf("很遗憾,你输了!
");
}
printf("player = %i, computer = %i
", player, computer);
}
return 0;
}
10.运算符的优先级