- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
三目运算符
-
语法 -> 表达式1 ? 表达式2 : 表达式3;
-
作用
-
如果表达式1的值为真-执行表达式2-并返回表达式2的结果
-
如果表达式1的值为假-执行表达式3-并返回表达式3的结果
-
-
示例
-
#include <stdio.h> #include <stdlib.h> int main() { //表达式1 ? 表达式2(1->TRUE) : 表达式3(1->FALSE) int a = !!1 ? 2 * 4 : 3 * 3; printf("%d \r\n", a); printf("%s \r\n", 1 ? "Hello" : "0xCC"); return 0; }
IF
-
单行格式IF
-
语法格式
-
if(/*条件表达式*/) { //条件成立执行代码 } //TODO
-
示例代码
-
#include <stdio.h> #include <stdlib.h> int main() { //定义变量 int nAge = 0; //网吧上网 //查询年龄 printf("请问您的年龄为 -> "); //用户输入 scanf_s("%d", &nAge); //年龄判断 if (nAge >= 18)//条件表达式 { //条件满足执行代码 printf("年龄满足 - 可以上网\r\n"); } //printf("年龄未满足 - 禁止上网\r\n"); return 0; }
-
-
多行格式IF
-
语法格式
-
if(/*条件表达式*/) { //条件成立执行语句 } else { //条件不成立执行语句 } //TODO
-
示例代码
-
#include <stdio.h> #include <stdlib.h> int main() { //定义变量 int nAge = 0; //网吧上网 //查询年龄 printf("请问您的年龄为 -> "); //用户输入 scanf_s("%d", &nAge); //年龄判断 if (nAge >= 18)//条件表达式 { //条件满足执行代码 printf("年龄满足 - 可以上网\r\n"); } else { //条件不成立执行的代码 printf("年龄未满足 - 禁止上网\r\n"); } //上述选择结构最终执行代码 printf("欢迎下次再来\r\n"); return 0; }
-
-
多条件的IF
-
语法格式
-
if(/*条件表达式*/) { //条件成立执行语句 } else if(/*条件表达式*/) { //条件成立执行语句 } else if(/*条件表达式*/) { //条件成立执行语句 } ... else { //上述所有条件均不成立执行语句 }
-
示例代码
-
#include <stdio.h> #include <stdlib.h> int main() { //定义变量 int nScore = 0; //分数考核 //查询年龄 printf("请问您的分数为 -> "); //用户输入 scanf_s("%d", &nScore); //数据判断 if (nScore == 100) { printf("恭喜你拿到满分-奖学金100R\r\n"); } else if (nScore >= 90) { printf("成绩优异-再接再厉-奖学金80R\r\n"); } else if (nScore < 60 && nScore >= 50) { printf("成绩未合格-叫家长\r\n"); } else { printf("重修-补考\r\n"); } return 0; }
-
-
嵌套结构IF
-
示例代码
-
#include <stdio.h> #include <stdlib.h> int main() { //定义变量 int nScore = 0; //分数考核 //查询年龄 printf("请问您的分数为 -> "); //用户输入 scanf_s("%d", &nScore); //数据判断 if (nScore >= 60) { printf("分数及格\r\n"); //分数及格 if (nScore == 100) { printf("满分\r\n"); } if (nScore >= 80) { printf("不错\r\n"); } if (nScore < 80) { printf("提升\r\n"); } } else { //分数不及格 printf("分数不及格\r\n"); if (nScore >= 50) { printf("补课\r\n"); } else if (nScore >= 30) { printf("补考\r\n"); } else { printf("重修\r\n"); } } return 0; }
-
SWITCH
- 语法规则
-
switch(1/*整数类型*/) { case 1: //TODO break; case 2: //TODO break; case 5: //TODO break; ... default //TODO break; }
-
- 语法特性
-
根据表达式的值跳转至对应case标签处,并执行剩余语句,执行到break;语句跳出选择结构
-
表达式的值必须是整数
-
如果表达式的值没有与其匹配的case分支存在default则跳转执行否则跳出选择结构
-
case分支不存在break则会顺序向下执行
-
- 示例代码
-
#include <stdio.h> #include <stdlib.h> int main() { //定义变量 char nScore = 0; //分数考核 //查询年龄 printf("请问您的分数为 -> "); //用户输入 scanf_s("%c", &nScore); //分数判断 switch (nScore) { case 'A': printf("A"); break; case 'B': printf("B"); break; case 'C': printf("C"); break; case 'D': printf("D"); break; case 'E': printf("E"); break; default: printf("Error"); break; } return 0; }
-
反汇编分析
- switch
-
009D9223 mov byte ptr [ebp-1],0 009D9227 movsx eax,byte ptr [ebp-1] 009D922B mov dword ptr [ebp-48h],eax 009D922E mov ecx,dword ptr [ebp-48h] 009D9231 sub ecx,41h 009D9234 mov dword ptr [ebp-48h],ecx 009D9237 cmp dword ptr [ebp-48h],4 009D923B ja 009D9292 009D923D mov edx,dword ptr [ebp-48h] 009D9240 jmp dword ptr [edx*4+009D9330h] 009D9247 push 0A6BE50h 009D924C call 009CBA2D 009D9251 add esp,4 009D9254 jmp 009D929F 009D9256 push 0A6BE54h 009D925B call 009CBA2D 009D9260 add esp,4 009D9263 jmp 009D929F 009D9265 push 0A6BE58h 009D926A call 009CBA2D 009D926F add esp,4 009D9272 jmp 009D929F 009D9274 push 0A6BE5Ch 009D9279 call 009CBA2D 009D927E add esp,4 009D9281 jmp 009D929F 009D9283 push 0A6BE60h 009D9288 call 009CBA2D 009D928D add esp,4 009D9290 jmp 009D929F 009D9292 push 0A6BE64h 009D9297 call 009CBA2D 009D929C add esp,4 switch (nScore) { case 'A': printf("A"); break; case 'B': printf("B"); break; case 'C': printf("C"); break; case 'D': printf("D"); break; case 'E': printf("E"); break; default: printf("Error"); break; }
- switch存在跳转表执行速度更快
-
- if
-
009D929F movsx eax,byte ptr [ebp-1] 009D92A3 cmp eax,41h 009D92A6 jne 009D92B7 009D92A8 push 0A6BE50h 009D92AD call 009CBA2D 009D92B2 add esp,4 009D92B5 jmp 009D9324 009D92B7 movsx eax,byte ptr [ebp-1] 009D92BB cmp eax,42h 009D92BE jne 009D92CF 009D92C0 push 0A6BE54h 009D92C5 call 009CBA2D 009D92CA add esp,4 009D92CD jmp 009D9324 009D92CF movsx eax,byte ptr [ebp-1] 009D92D3 cmp eax,43h 009D92D6 jne 009D92E7 009D92D8 push 0A6BE58h 009D92DD call 009CBA2D 009D92E2 add esp,4 009D92E5 jmp 009D9324 009D92E7 movsx eax,byte ptr [ebp-1] 009D92EB cmp eax,44h 009D92EE jne 009D92FF 009D92F0 push 0A6BE5Ch 009D92F5 call 009CBA2D 009D92FA add esp,4 009D92FD jmp 009D9324 009D92FF movsx eax,byte ptr [ebp-1] 009D9303 cmp eax,45h 009D9306 jne 009D9317 009D9308 push 0A6BE60h 009D930D call 009CBA2D 009D9312 add esp,4 009D9315 jmp 009D9324 009D9317 push 0A6BE64h 009D931C call 009CBA2D 009D9321 add esp,4 if (nScore == 'A') { printf("A"); } else if (nScore == 'B') { printf("B"); } else if (nScore == 'C') { printf("C"); } else if (nScore == 'D') { printf("D"); } else if (nScore == 'E') { printf("E"); } else { printf("Error"); }
-