Switch语句:在C v/s中逻辑是否不同.其他语言,比如Java
Switch Statement: Is the logic different in C v/s. other languages like Java?
我正在学习这个C编程教程。它说:
switch语句实际上是完全不同的(与其他语言),它实际上是一个"跳转表"。而不是随机的布尔表达式,您只能放置结果为整数的表达式,这些整数用于计算从交换机顶部到匹配该值的部分的跳转。下面是一些代码,我们将分解它们来理解"跳转表"的概念。
但是,需要比较switch语句的case,直到找到匹配(否则返回default)。
它与多个if-else语句有什么不同?或者,它只是一个语法糖?我遗漏了什么重要的东西吗?
它的实现方式似乎取决于编译器。Switch case语句如何在内部实现或工作?
,但一般来说,switch语句有一个前置条件,允许编译器对其进行优化,这与if语句不同,if语句的比较对象总是整数类型(char/int/long)。
其他语言允许可以在编译时求值的原语用作switch语句变量(c#中的字符串)。
但总的来说,除了潜在的加速(以及如果不中断可能发生的失败)之外,与一堆"如果"没有行为差异。
Java实现类似于GCC 4.8。javac
编译为:
-
tableswitch
如果表是紧凑的,它是0 (1) -
lookupswitch
,如果没有,则为O(log(n))二进制搜索
GCC使用了类似的技术:
- 与
*%rax
紧致时O(1)跳表 - O(log(n)) else if binary search否则
其中紧化的定义在:
- Java: https://stackoverflow.com/a/31032054/895245
- GCC: Switch case语句如何在内部实现或工作?
- 在Java中使用
javap
- in C with
objdump -S
紧凑的例子:
switch (i) {
case 0:
j = 0;
break;
case 1:
j = 1;
break;
case 2:
j = 2;
break;
case 3:
j = 3;
break;
case 4:
j = 4;
break;
case 5:
j = 5;
break;
};
非紧凑示例:
switch (i) {
case 0:
j = 0;
break;
case 1:
j = 1;
break;
case 0x10:
j = 2;
break;
case 0x100:
j = 3;
break;
case 0x1000:
j = 4;
break;
case 0xFFFFFFF:
j = 5;
break;
};
相关文章:
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 是否可以使用其他变量为变量分配值,而无需在 C++ 中更改其值?
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- MOVNTI 存储是否相对于由同一线程创建的其他 MOVNTI 存储重新排序?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- 这种比较是否不一致(或者存在其他问题)?
- 了解'this'或其他参数是否为右值
- 如何在 Linux 下使用 c++ 知道文件是否被其他进程使用?
- 严格的别名是否会阻止您通过其他类型写入 char 数组?
- C++如何判断互斥体在阻塞其他线程时是否被单个线程不成比例地占用
- 当其他线程正在编写线程安全时,我是否必须互斥读操作
- 检查IP是否在其他IP网络范围内,并查找下一个可用IP
- cv::cuda::setTo()是否有其他选择
- 如何知道指针是否已在其他地方释放
- 如何检查一个字符串是否包含多个其他字符串?
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- 除了系统("pause")之外,是否有其他选项可以保持可执行文件打开?
- 在代码的其他部分中对lock_gard和不使用相同的互斥锁是否安全?