c++ - 스위치 문 블록 앞에 기본값이 배치되는 상황을 처리하는 방법
天蓬老师
天蓬老师 2017-07-06 10:35:10
0
3
2494
으아아아

이 코드는 왜 3인가요? i가 처음 1일 때 default: c+=i; 가 사용되고, 두 번째로 i가 2일 때 case 2: c++;break; 가 사용되는 경우가 아닌가요? c=2 가 마지막에 출력되나요? 왜 3인가요?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

모든 응답(3)
女神的闺蜜爱上我

우선 스위치에서 주의해야 할 몇 가지 사항을 명확히 하겠습니다.

1.

switch 语句体由一系列 case 标签和一个可选 default 标签组成。 case 语句中的两个常量表达式的计算结果不能为同一个值。 default 标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch 语句是无意义的。默认语句(即default标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置casedefault 标签只能显示在 switch 성명서 내.
발췌: Microsoft Visual Studio 2015 c++ Switch 문 공식 문서

2.

위에 언급된 casedefault本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break语句或者switch 문의 범위는 끝납니다.

이 문제에 대해서는

1단계 : i=1일 때 i!=2&&i!=4이므로 default 태그 이후에 실행이 시작됩니다. c+=i; 명령문 실행(이제 컴파일러가 c를 0으로 초기화한다고 가정합니다. 모든 컴파일러가 그렇게 친숙하지는 않다는 것을 알아야 합니다) 실행 후 c의 값은 1입니다. STEP 2i=1时,由于i!=2&&i!=4故从default标签后开始执行,此时执行语句c+=i;(我们现在就假设编译器帮你把c初始化为0,要知道并不是所有的编译器都这么友好)执行后c的值为1;
STEP 2:综合上述1,2可知由于此时没有碰到任何break语句也没有到switch语句的作用域结束(因为这个default语句是放在第一个的)所以它接着向后执行case 2后的语句(此时编译器已经不看满不满足case标签了)此时执行语句c++;执行后c的值为2;遇到break语句跳出switch语句。
STEP 3:当i=2时,由于i满足case 2的情况,所以直接从case 2便签后的语句开始执行,此时执行语句c++,执行后c的值为3,遇到break语句跳出switch语句。
STEP 4:当i=3时,跳出for: 위 1, 2를 토대로 현재는 break 문이 발견되지 않았고 switch 문의 범위가 종료되지 않았음을 알 수 있습니다. (이 기본값 때문에 문이 먼저 배치되므로 case 2 이후의 문을 거꾸로 실행합니다(이때 컴파일러는 를 충족하지 않았습니다). case Label) 이때 c++ 문이 실행되며, break 문을 만나면 실행 후 c의 값은 2입니다. >switch 문이 튀어나왔습니다.
STEP 3: i=2일 때 i는 case 2의 상황을 만족하므로 case 2 뒤의 문장을 바로 따라갑니다. note 실행을 시작합니다. 이때 c++ 문이 실행됩니다. 실행 후 c의 값은 3입니다. break 문을 만나면 switch를 실행합니다. 문이 튀어나왔습니다.

🎜STEP 4🎜: i=3일 때 for 루프에서 벗어나 c=3을 출력합니다. 🎜🎜 (위 프로세스는 제가 Visual Studio 2015 단일 단계 디버깅을 사용하여 도출한 결론입니다. 및 데이터 결합) 🎜 🎜
三叔

i=1이면 기본값: c=1이고 break가 없으므로 계속해서 Case 2를 일치시켜 c=2 break를 얻습니다.
i=2일 경우 Case 2를 먼저 일치시키고 Case 2로 들어갑니다: c=3 break
i=3이면 주기가 유지되지 않습니다.
출력 c는 3

三叔

으아악

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿