运算符
/*
// int 占用4个字节 double 占用8个字节
// 只是相同类型的数据才能进行运算, 隐式类型转换 将小类型转换为大类型, 然后再进行运算
// 在赋值的时候系统又给我们进行了一次隐式类型转换
// 发现, 如果在隐式类型转换的时候, 将大类型转换为小类型会丢失精度
int result = 10.9;
printf("result = %d\n", result);
// 强制类型转换格式: (类型)被强制类型转换的数据
int result2 = (int)10.9;
printf("result2 = %i", result2);
// 自动类型提升
// 自动类型的提升, 将参与运算的数据都转换为同一类型后再运算
// 会自动将小的数据类型提升为大的数据类型
int result3 = 1 + 9.9; // 1.0 + 9.9 = 10.9
*/
/*
// 在算术运算中, 参与运算的是什么类型, 计算出来就是什么类型
// double result = 1.0 / 2; // 1.0 / 2.0 --> 0.5
// double result = (double)1 / 2;// 1.0 / 2.0 --> 0.5
double result = (double)(1 / 2); // (double)(0) --> 0.0
printf("result = %lf\n", result);
*/
// 算术运算符的结合性, 左结合, 从左至右的计算
// 算术运算符的优先级 * / % 大于 + -
// 如果优先级和结合同时存在, 那么先优先级再结核性
int result = 3 + 4 * 5 + 6;
printf("result = %i\n", result);
赋值运算符
// 最简单的赋值运算符
// 赋值运算符的结合性: 从右至左
// int result = 10;
// 复合赋值运算符: += -= *= /= %=
int result = 10;
// result = result + 5;// result = 10 + 5; result = 15
// result += 5; // 相当于 result = result + 5;
result -= 5; // 相当于result = result - 5;
printf("result = %i\n", result);
自增自减
/*
int result = 10;
// result = result + 5;
// result += 5;
// result = result + 1;
// result += 1;
// 自增: 如果想让某一个数加1可以使用自增
// result++;
// result++;
// result = result - 1;
// result -= 1;
// 自减: 如果想让某一个数减1可以使用自减
// result--;
// 自增的两种写法
// result++;
// ++result;
// 自减的两种写法
result--;
--result;
printf("result = %i\n", result);
*/
/*
// 自增自减写在前面和后面的区别
// 如果++写在变量的前面, 那么会先将变量自增再用自增之后的结果参与运算
// 如果++写在变量的后面, 那么会先将变量的值参与运算再将变量自增
// 总结一句话: ++在前, 先自增再运算, ++在后, 先运算再自增
int a = 10;
// int b = a++;// b = 10, a = 11
// int b = ++a;// a = 11, b = 11;
// int b = a--;// b = 10, a = 9;
int b = --a; // a = 9, b = 9;
printf("a = %i , b = %i\n", a, b);
*/
/*
// 无论++在前还是在后, 最终都会自增一次
int a = 10;
// 10 + 12
// int b = (a++) + (++a);
// a = 12
// b = 22
// 10 + 11
// int b = (a++) + (a++);
// a = 12
// b = 21
// 11 + 12
int b = (++a) + (++a);
// a = 12
// b = 23
printf("a = %i, b = %i\n", a, b);
*/
/*
// 5++;
double doubleValue = 10.9;
doubleValue++;
printf("%f", doubleValue);
*/
int a = 10;
// int b = a++;
// b = a; a = a + 1;
int b = ++a;
// a = a + 1; b = a;
printf("a = %i, b = %i\n", a, b); // a = 11, b = 11
sizeof
// sizeof可以用来计算一个变量或一个常量、一种数据类型所占的内存字节数
// 注意: sizeof是一个运算符, 不是一个函数
// 利用sizeof计算的格式: sizeof(变量/常量/数据类型);
/*
// 计算常量占用的内存字节数
// int number = sizeof(10);// 10是一个整型常量, 整型 == int == 4
// 如果利用sizeof计算常量, 那么可以省略()
int number = sizeof 10;
printf("number = %i\n", number);
*/
/*
// 计算变量
double doubleValue = 10.9;// doubleValue是实型 , 实型 == double == 8
// int number = sizeof(doubleValue);
// 如果利用sizeof计算变量, 那么可以省略(
int number = sizeof doubleValue;
printf("number = %i\n", number);
*/
/*
// 计算数据类型
int number = sizeof(char);
// 注意: 如果利用sizeof计算数据类型, ()不能省略
// int number = sizeof char;
printf("number = %i\n", number);
*/
逗号运算符
int result;
// 结合性 从左至右
// a = 15, b = 6, result = 15 + 6 = 21
a = a + 5, b = b + 1 , result = a + b;
printf("a = %i, b = %i, result = %i\n", a, b, result);
*/
// 只要是运算符那么一定会有运算结果, 逗号运算符也不例外.
// 逗号运算符的结果是 最后一个表达式的结果
int a = 10;
int b = 5;
// 6 a = 10 + 5 = 15 b = 5 + 1 = 6
int result = ((a = a + 5), (b = b + 1)); // 仅仅作为了解
printf("a = %i, b = %i, result = %i\n", a, b, result);
关系运算符
/*
关系运算符:
>
<
>=
<=
==
!=
关系运算符的返回值只有两种, 要么真, 要么假. 1(真)和0(假)
*/
/*
int a = 10;
int b = 5;
int result = a > b;// 吗? 大于, 真, 非0即真.
printf("result = %i\n", result);
*/
/*
int a = 10;
int b = 8;
int result = a != b;
printf("result = %i\n", result);
*/
/*
// 关系运算符注意点
// 关系运算符也有优先级. > < >= <= 优先级大于 == !=
// 1 == 1
// int result = 1 == 10 > 5;
// 算术运算符的优先级 大于 关系运算符
// 2 < 4
// int result = 1 + 1 < 2 + 2;
// 关系运算符的结合型: 从左至右
// 1 > 1
// int result = 10 > 3 > 1;
// 如果优先级和结合性同时存在, 先优先级再结核性
// 11 > 9 == 3 > 1
// 1 == 3 > 1
// 1 == 1
int result = 10 + 1 > 5 + 4 == 3 > 1;
printf("result = %i\n", result);
*/
// 练习
// int result = 3 > 4 + 7; // 3 > 11 = 0
// int result = (3>4) + 7; // 0 + 7
// 5 != 4 + 14 > 3 == 10
// 5 != 18 > 3 == 10
// 5 != 1 == 10
// 1 == 10
int result = 5 != 4 + 2 * 7 > 3 == 10;
printf("result = %i\n", result);
逻辑运算符
/*
逻辑运算符的返回值只有两种: 要么真要么假, 要么是1(真), 要么是0(假)
&&(与运算)
格式: 表达式1 && 表达式2
结合性: 从左至右
只有表达式1和表达式2都为真的时候, 逻辑与表达式才返回真
如果表达式1或者表达式2中有一个是假, 那么逻辑与表达式返回的结果都是假
口诀: 一假则假
||(或运算)
格式: 表达式1 || 表达式2
结合性: 从左至右
只要表达式1或者表达式2中有一个是真的, 逻辑或表达式返回的值就是真
只有表达式1和表达式2的值都是假, 逻辑或的值才是假
口诀: 一真则真
!(非运算)
格式: !表达式
结合性: 从右至左
如果表达式是真, 就返回假
如果表达式是加, 就返回真
取反
*/
/*
// 1 && 0
int result = 10 > 8 && 5 > 8;
printf("result = %i\n", result);
*/
/*
// 1 || 0
int result = 10 > 18 || 15 > 8;
printf("result = %i\n", result);
*/
/*
int result = !(10 > 18);// !0
printf("result = %i\n", result);
*/
// 注意点:
/*
// 由于C语言规定, 任何数值都有真假性, 非0即真. 所有逻辑运算符可以直接与数值进行计算
// int result = 0 && 11;
// int result = 0 || 0;
// 逻辑非结合性: 从右至左
int result = !!!!!!1;// 0
printf("result = %i\n", result);
*/
// 由于逻辑与有一个特点: 一假则假, 所以如果前面的表达式的值为假, 那么后面的表达式没有必要参与运算
// int result = 10 > 18 && 9 > 5;
// int a = 10;
// int result = 10 > 18 && ++a > 5;
// printf("result = %i , a = %i\n", result, a);
// 由于逻辑或有一个特点: 一真则真, 所以如果前面的表达式的值为真, 那么后面的表达式没有必要参与运算
// 逻辑与和逻辑或的这个特点, 称之为逻辑运算符的短路
int a = 10;
int result = 10 > 18 || ++a > 5;
printf("result = %i , a = %i\n", result, a);
三目运算符
/*
int a = 20;
int b = 15;
// int result = a > b;
// 三目运算符格式: 条件表达式 ? 结果A : 结果B
// 结合性: 从左至右
// 只要条件表达式为真就返回结果A, 如果条件表达式为假, 那么就返回结果B
// a大于b吗? 如果a大于b就返回a, 否则返回b
// int result = (a > b)? a : b;
// 三目运算符的优先级: 低于关系运算符和算术运算符
// 25 > 15 ? 20 : 15
int result = a + 5 > b ? a : b;
printf("result = %i\n", result);
*/
// 从键盘输入3个整数, 利用三目运算符取出最大值并输出
// 1.提示用于输出三个整数, 用逗号隔开, 以回车结束
printf("请输入三个整数, 用逗号隔开, 以回车结束\n");
// 2.定义三个变量保存用户输入的数据
int num1, num2, num3;
// 3.利用scanf函数接收用户输入的数据
scanf("%i,%i,%i", &num1, &num2, &num3); // 17, 5, 88
// 4.比较三个数的大小, 取出最大值
// 4.1获取num1和num2中的最大值
// int temp = num1 > num2 ? num1 : num2;// 17 > 5 ? 17 : 5; temp = 17
// 4.2利用num1和num2中的最大值和剩下的num3比较
// int result = temp > num3 ? temp : num3;// 17 > 88 ? 17 : 88; result = 88
// youtube写法 usb写法
// 1.阅读性比较差
// 2.性能也比较差
int result = (num1 > num2 ? num1 : num2) > num3 ? (num1 > num2 ? num1 : num2) : num3;
// 5.输出结果
printf("result= %i\n", result);
if基本概念
/*
第一种格式:
if (条件表达式) {
语句...
}
只要 条件表达式 为真, 那么就会执行if后面大括号中的内容.
第二种格式:
if (条件表达式) {
语句...
}else {
语句...
}
只要 条件表达式 为真,那么就会执行if后面大括号中的内容.
如果 条件表达式 不为真, 那么就会执行else后面大括号中的内容
规律: 两个大括号中的内容, 一定会有一个会被执行
第三种格式:
if (条件表达式1) {
语句...
} else if (条件表达式2) {
语句...
} else if (条件表达式3) {
语句...
}
....
else {
语句...
}
只要 条件表达式1 为真,那么就会执行if后面大括号中的内容. 而其它大括号不会被执行
如果 条件表达式1 不为真, 那么就会取判断条件表达式2, 如果 条件表达式2 为真就会执行 条件表达式2 后面大括号中的内容
其它的else if一次类推,
当前面所有的if, else if的条件表达式都不为真, 就会执行else后面大括号中的内容
规律:
众多大括号只会执行其中一个
如果执行到后面大括号中的内容, 代表前面的所有条件都不满足
第4种格式:
if (条件表达式)
语句...
如果省略if后面的大括号, 当条件表达式为真时, 只会执行if后面的第一条语句
第5种格式:(if嵌套)
if(添加表达式) {
if(添加表达式) {
}
}else {
if(添加表达式) {
}else {
}
}
*/
int main(int argc, const char * argv[]) {
/*
int age = 12;
// 判断年龄是否大于等于18岁
if (age >= 18)
{
printf("开网卡\n");
}
printf("end\n");
*/
/*
int age = 19;
if (age >= 18) {
printf("开网卡\n");
}else {
printf("回家叫芭比\n");
}
*/
/*
int age = 6;
if (age == 1) {
printf("该学走路了");
}else if (age == 6) {
printf("该上学了");
}else if (age == 18) {
printf("该谈朋友了");
}else {
printf("在家好好呆着");
}
*/
/*
int age = 15;
if (age >= 18)
printf("开网卡\n"); // 只有条件满足才会执行
printf("给钱\n"); // 无论条件是否满足, 都会执行
*/
// 判断一个数, 是否在3~5之间
// 3<= a <= 5; // 错误
// (a >= 3) && (a <= 5);
int a = 10;
if (a >= 3) {
if (a <= 5) {
printf("a是一个3~5之间的数\n");
}else {
printf("a不是一个3~5之间的数\n");
}
}else {
printf("a不是一个3~5之间的数\n");
}
printf("end\n");
if练习
// 从键盘输入一个整数,判断其是否是偶数,如果是偶数就输出YES,否则输出NO;
/*
// 1.提示用户输入一个整数
printf("请输入一个整数, 以回车结束\n");
// 2.定义变量保存用户输入的正常
int number = -1;
// 3.接收用户输入的整数
scanf("%i", &number);
// 4.判断是否是偶数(偶数的特点: 可以被2整数, 没有余数)
// int result = number % 2;
if ((number % 2) == 0) {
printf("YES\n");
}else {
// 5.输出结果
printf("NO\n");
}
*/
// 接收用户输入的1~7的整数,根据用户输入的整数,输出对应的星期几
/*
// 1.提示用户输入1~7的整数
printf("请输入一个1~7的整数, 以回车结束\n");
// 2.定义变量保存
int number = -1;
// 3.接收用户输入的整数
scanf("%i", &number);
// 4.判断用户输入的整数, 输出对应的结果
// 4.1排除非法数据
// if (number>7 || number<1) {
// printf("USB\n");
// return 0; 结束函数
// }
if (number>7 || number<1) {
printf("USB\n");
}else if (number == 1) {
printf("星期1\n");
}else if (number == 2) {
printf("星期2\n");
}else if (number == 3) {
printf("星期3\n");
}else if (number == 4) {
printf("星期4\n");
}else if (number == 5) {
printf("星期5\n");
}else if (number == 6) {
printf("星期6\n");
}else if (number == 7) {
printf("星期7\n");
}
printf("其它操作\n");
*/
// 接收用户输入的一个整数month代表月份,根据月份输出对应的季节
// 3~5 春季 6~8 夏季 9~11 秋季 12 1 2冬季
/*
// 1.提示用户输入一个整数
printf("请输入一个整数, 以回车结束\n");
// 2.定义变量保存用户输入的正常
int number = -1;
// 3.接收用户输入的整数
scanf("%i", &number);
// 4.根据用户输入的整数, 输出对应的季节
*/
/*
if (number >= 3 && number <= 5) {
printf("春季");
}else if (number >= 6 && number <= 8) {
printf("夏季");
}else if (number >= 9 && number <= 11) {
printf("秋季");
}else if (number == 12 || number == 1 || number == 2) {
printf("穿秋裤的季节");
}else {
printf("地球不属于你\n");
}
*/
/*
if (number >12 || number < 1) {
printf("地球不属于你\n");
}else if (number >= 3 && number <= 5) {
printf("春季");
}else if (number >= 6 && number <= 8) {
printf("夏季");
}else if (number >= 9 && number <= 11) {
printf("秋季");
}else {
printf("穿秋裤的季节");
}
*/
// 键盘输入两个整数,判断大小后输出较大的那个数
/*
// 1.提示用户输入两个整数
printf("请输入一个整数, 以回车结束\n");
// 2.定义变量保存用户输入的整数
int number1 = -1;
int number2 = -1;
// 3.接收用户输入的整数
scanf("%i,%i", &number1, &number2);
// 4.比较两个数的大小
// int max = number1 > number2 ? number1 : number2;
int max = -1; // 保存最大值
if (number1 > number2) {
max = number1;
number1 = 0;
}else {
max = number2;
number2 = 0;
}
printf("max = %i\n", max);
printf("number1 = %i, number2 = %i\n", number1, number2);
*/
/*
三目运算符可以简化if else的操作, 如果仅仅是为了获取某个值, 那么建议使用三目运算符
if else: 可以用来做一些更复杂的操作, 例如判断完毕之后还需要进行一些后续处理
*/
// 从键盘输入3个整数,判断大小后输出较大的那个数
/*
// 1.提示用户输入3个整数
printf("请输入3个整数, 以回车结束\n");
// 2.定义变量保存用户输入的整数
int number1 = -1;
int number2 = -1;
int number3 = -1;
// 3.接收用户输入的整数
scanf("%i,%i,%i", &number1, &number2, &number3);
// 4.获取最值
int max = -1; // 保存最大值
*/
/*
max = number1 > number2 ? number1 : number2;
max = max > number3 ? max : number3;
printf("max = %i\n", max);
*/
/*
if (number1 > number2 && number1 > number3) {
max = number1;
}else if (number2 > number1 && number2 > number3) {
max = number2;
}else if (number3 > number1 && number3 > number2) {
max = number3;
}
printf("max = %i\n", max);
*/
/*
if (number1 > number2) {
// 代表number1当前最大
if (number1 > number3) {
max = number1; // number1是最大
} else {
max = number3; // number3是最大
}
}else if (number2 > number3) { // 此时此刻number2是最大的
// 代表number2当前最大
max = number2;
} else {
max = number3;
}
printf("max = %i\n", max);
*/
// 从键盘输入3个整数,排序后输出
// 1.提示用户输入3个整数
printf("请输入3个整数, 以回车结束\n");
// 2.定义变量保存用户输入的整数
int number1 = -1;
int number2 = -1;
int number3 = -1;
// 3.接收用户输入的整数
scanf("%i,%i,%i", &number1, &number2, &number3);
// 4.排序
/*
if (number1 > number2 && number2 > number3) {
printf("%i, %i , %i\n", number1, number2, number3);
}else if (number1 > number3 && number3 > number2) {
printf("%i, %i , %i\n", number1, number3, number2);
}else if (number2 > number1 && number1 > number3) {
printf("%i, %i , %i\n", number2, number1, number3);
}else if (number2 > number3 && number3 > number1) {
printf("%i, %i , %i\n", number2, number3, number1);
}else if (number3 > number1 && number1 > number2) {
printf("%i, %i , %i\n", number3, number1, number2);
}else if (number3 > number2 && number2 > number1) {
printf("%i, %i , %i\n", number3, number2, number1);
}
*/
/*
// 如何交换两个变量的值
int a = 10; // 可乐
int b = 5; // 雪碧
int temp = -1;
printf("交换前: a = %i, b = %i\n", a, b);
temp = a;
a = b;
b = temp;
printf("交换后: a = %i, b = %i\n", a, b);
*/
// 4.1利用number1和number2进行比较, 如果number1小于number2交换两个变量的值
if (number1 < number2) {
int temp = number1;
number1 = number2;
number2 = temp;
}
if (number1 < number3) {
int temp = number1;
number1 = number3;
number3 = temp;
}
if (number2 < number3) {
int temp = number2;
number2 = number3;
number3 = temp;
}
printf("%i, %i, %i\n", number1, number2, number3);
if注意点
/
// 因为C语言中, 任何数值都有真假性, 非0即真
if (0) {
printf("来这二\n");
} else {
printf("不去\n");
}
*/
// 移动代码的快捷键:
// 上下移动: command + option + [(上) / ](下)
// 左右移动: command + ](右) [(左)
/*
int age = 18;
// == =
if (age = 18) { // 18
printf("开网卡\n");
}
*/
// 以后如果要判断某一个变量是否等于某一个值, 建议把常量写前面, 变量写后面
/*
if (18 = age) {
printf("开网卡\n");
}
*/
/*
// if如果省略大括号, 就会管理离他最近的一条语句 , 而;是一条空语句
if (0);
printf("lnj\n");
*/
/*
// 如果要在if后面定义变量, 那么必须写上大括号
if (1)
int number = 10;
printf("number = %i\n", number);
*/
// 如果if, else省略大括号, 那么else会匹配离他最近的一个if
if(0){
if(1){
printf("A\n");
} else {
printf("B\n");
}
} else{
if (1){
printf("C\n");
} else{
printf("D\n");
}
}
printf("end\n");
石头剪子布
/*
有两个角色 : 玩家(我), 电脑
两个角色都可以出 0 == 石头/ 1 == 剪子 / 2 == 布
由于我们不知道玩家和电脑到底出的什么拳, 所以我们用0, 1, 2来代替石头/ 剪子 / 布
玩家的出拳可以让用户自己输入
电脑的出拳必须生产一个随机数, 如何生产随机数?
将玩家的出拳和电脑的出拳进行比较, 得到比赛结果
石头 > 剪刀 / 剪刀 > 布 / 布 > 石头
*/
// 1.生产电脑的出拳
// arc4random_uniform方法会根据传入的整数生产一个随机数
// 生成的值就是 0~(N-1)的值
int cmp = arc4random_uniform(3);
// printf("cmp = %i\n", cmp);
// 2.接收玩家的出拳
// 2.1定义变量保存玩家的出拳
int player = -1;
// 2.2利用scanf接收
printf("请输入出拳, 0代表石头, 1代表剪刀, 2代表布\n");
scanf("%i", &player);
// 3.比较玩家和电脑的出拳
if (((0 == player)&&(1 == cmp)) ||
((1 == player) && (2 == cmp)) ||
((2 == player) && (0 == cmp))) {
printf("玩家获胜\n");
}else if (((0 == cmp)&&(1 == player)) ||
((1 == cmp) && (2 == player)) ||
((2 == cmp) && (0 == player)))
{
printf("电脑获胜\n");
} else {
printf("以和为贵\n");
}
printf("player = %i, cmp = %i\n", player, cmp);
scanft
// 江哥提示:insert code here...
NSLog(@"Hello, World!");
scanfbuch
// 定义两个字符类型的变量,并依次单个输入输出!
// 1.定义两个变量
char a;
int b;
// 2.提示用户输入
printf("亲,来两个字符!\n");
// 3.接收用户输入
scanf("%c",&a);
// 4.输出
printf("a = %c\n",a);
// getchar();
// char c;
// scanf("%c",&c);
scanf("%i",&b);
printf("b = %i\n",b);