04、5_C基础(goto、if-else和switch-case)
如果实现某种图形,我们可以列方程,例如一个零星,我们可以建立坐标
如果实现求位数的话,可以对取lg。
#include <streamio>
#inculde <math.h>
int n = 100;
double dblBitCount = 0.0;
for (int i = 1; i <= n; i++)
{
dblBitCount = dblBitCount + log10(i);
}
std::cout << (int)ceil(dblBitCount); << std::endl;
system("pause")
return 0;
goto
goto可以跳出多层循环外
简化状态间的跳转
实现多重嵌套条件下的错误处理和资源清理 cpp用try cash代替
#include <stdio.h>
int main() {
printf("Start\n");
goto label; // 跳转到标签 label 处
printf("This will be skipped\n");
label: // 定义标签
printf("Jumped to label\n");
return 0;
}
//#输出
//Start
//Jumped to label
goto
语句是一些编程语言中的控制流语句,允许程序无条件地跳转到指定的位置,这个位置通常是由一个标签(label)标识的。在不同的编程语言中,goto
的语法和用法可能会有所不同,但基本原理是相同的。下面是一些关于 goto
语句的详细信息:
1. 基本用法
在使用 goto
时,你需要:
定义一个标签(label),作为跳转的目标。
使用
goto
语句并指定目标标签,实现跳转。
2. 示例
以下是 C 语言中 goto
的一个简单示例:
#include <stdio.h>
int main() {
printf("Start\n");
goto label; // 跳转到标签 label 处,标签名字自定义
printf("This will be skipped\n");
label: // 定义标签
printf("Jumped to label\n");
return 0;
}
在这个例子中,程序会输出:
Start
Jumped to label
goto label;
语句使程序跳过了 printf("This will be skipped\n");
行,直接跳转到标签 label
处继续执行。
3. 使用场景
虽然 goto
语句在现代编程中不常见,但在某些特殊情况下它仍然有用:
错误处理:在某些低级语言(如 C 语言)中,可以使用
goto
来实现多重嵌套条件下的错误处理和资源清理。状态机实现:某些状态机实现中,
goto
可以简化状态间的跳转。
4. 注意事项
尽管 goto
有其使用场景,但滥用 goto
会导致代码难以阅读和维护,形成所谓的“意大利面条代码”(spaghetti code)。因此,在大多数现代编程实践中,建议尽量避免使用 goto
,而选择更结构化的控制流语句,如循环、函数调用和异常处理机制。
5. 替代方法
许多编程语言提供了替代 goto
的结构化控制流语句。例如:
循环:
for
、while
、do-while
等。条件语句:
if
、switch
等。函数和方法:通过函数调用实现代码重用和跳转。
if-else和switch-case比较
1. 语法和可读性
Switch-case:
适用于基于单个变量的多分支选择。
语法简洁,结构清晰。
可读性较好,尤其是在有多个分支的情况下。
switch (variable) {
case value1:
// code to execute if variable == value1
break;
case value2:
// code to execute if variable == value2
break;
// other cases...
default:
// code to execute if variable doesn't match any case
}
If-else:
适用于复杂条件和多变量的判断。
可以处理更灵活和复杂的逻辑。
当条件较多时,嵌套的if-else结构可能会变得难以阅读。
if (condition1) {
// code to execute if condition1 is true
} else if (condition2) {
// code to execute if condition2 is true
} else {
// code to execute if none of the above conditions are true
}
2. 性能
Switch-case 通常在编译时可以进行优化,特别是在条件值是整数或枚举类型时,性能会较好。编译器可以使用跳转表来实现O(1)的时间复杂度。
If-else 的性能取决于条件的复杂性和条件的数量。每个条件都需要进行单独的比较,可能导致O(n)的时间复杂度。
3. 使用场景
Switch-case:
适用于处理固定值的比较(如枚举类型、整数等)。
当需要在多个选项之间进行选择,并且这些选项是离散的、固定的值时,switch-case是更好的选择。
If-else:
适用于处理复杂的条件逻辑,尤其是涉及多个变量或复杂表达式的情况。
当条件不适合用简单的值来表示,或者需要进行范围比较时,if-else更为合适。
示例比较
Switch-case示例:
int day = 3;
switch (day) {
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
default:
printf("Invalid day\n");
}
If-else示例:
int day = 3;
if (day == 1) {
printf("Monday\n");
} else if (day == 2) {
printf("Tuesday\n");
} else if (day == 3) {
printf("Wednesday\n");
} else {
printf("Invalid day\n");
}
switch的default
在switch语句中,default
是一个可选的分支,用于在所有case条件都不匹配时执行代码。它相当于if-else结构中的最后一个else分支,用来处理所有没有被显式处理的情况。default
通常用于提供一个备用的处理路径,以确保程序在遇到未预见的值时仍能正常运行。
示例
以下是一个包含default
分支的switch语句示例:
#include <stdio.h>
int main() {
int number = 5;
switch (number) {
case 1:
printf("Number is 1\n");
break;
case 2:
printf("Number is 2\n");
break;
case 3:
printf("Number is 3\n");
break;
default:
printf("Number is not 1, 2, or 3\n");
}
return 0;
}
在这个例子中,如果number
的值不是1、2或3,程序将会执行default
分支,并输出“Number is not 1, 2, or 3”。
使用default
的注意事项
放置位置:
default
分支可以放在switch语句的任何位置,但通常放在最后,以提高代码的可读性。break语句:和其他case一样,
default
分支通常也会以break
语句结束,以防止程序继续执行后续的case分支。如果default
是最后一个分支,break
语句可以省略。
为什么需要default
处理意外值:在处理意外或未预见的值时,
default
分支可以提供一个安全网,防止程序因未处理的情况而崩溃或产生错误结果。增强健壮性:
default
分支使得程序更加健壮,因为它确保了即使所有显式case都不匹配时,程序仍有合理的处理路径。
总之,default
分支在switch语句中起到一个备用和安全保障的作用,确保程序在所有情况都能有合适的处理。