相关疑难解决方法(0)

是否使用 if (0) 跳过应该工作的开关中的案例?

我有一种情况,我希望 C++ switch 语句中的两种情况都落入第三种情况。具体来说,第二种情况会落入第三种情况,而第一种情况也会落入第三种情况,而不会经过第二种情况。

我有一个愚蠢的想法,尝试了一下,它奏效了!我将第二个箱子包裹在一个if (0) {... }. 它看起来像这样:

#ifdef __cplusplus
#  include <cstdio>
#else
#  include <stdio.h>
#endif

int main(void) {
    for (int i = 0; i < 3; i++) {
        printf("%d: ", i);
        switch (i) {
        case 0:
            putchar('a');
            // @fallthrough@
            if (0) {        // fall past all of case 1 (!)
        case 1:
            putchar('b');
            // @fallthrough@
            }
        case 2:
            putchar('c');
            break;
        }
        putchar('\n');
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到了所需的输出:

0: ac
1: bc …
Run Code Online (Sandbox Code Playgroud)

c c++ if-statement switch-statement language-lawyer

125
推荐指数
3
解决办法
6259
查看次数

"除了最后一个之外的每一个"(或"每个连续元素对之间")的成语

每个人都会遇到这个问题:

for(const auto& item : items) {
    cout << item << separator;
}
Run Code Online (Sandbox Code Playgroud)

...而且你得到了一个你不想要的额外分隔符.有时候它不是打印,而是执行一些其他动作,但是相同类型的连续动作需要一些分隔符动作 - 但最后一个动作不需要.

现在,如果你使用old-school for循环和数组,你会这样做

for(int i = 0; i < num_items; i++)
    cout << items[i];
    if (i < num_items - 1) { cout << separator; }
}
Run Code Online (Sandbox Code Playgroud)

(或者你可以特别说明循环中的最后一项.)如果你有任何承认非破坏性迭代器的东西,即使你不知道它的大小,你可以这样做:

for(auto it = items.cbegin(); it != items.cend(); it++) {
    cout << *it;
    if (std::next(it) != items.cend()) { cout << separator; }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢最后两个的美学,并喜欢一系列的循环.我可以获得与后两个相同的效果,但使用更多漂亮的C++ 11ish结构吗?


为了进一步扩展这个问题(除了这个之外),我会说我也不想明确地说明第一个或最后一个元素的特殊情况.这是一个"实施细节",我不想被打扰.所以,在虚构的未来C++中,可能是这样的:

for(const auto& item : items) {
    cout << item;
} and_between …
Run Code Online (Sandbox Code Playgroud)

c++ idioms separator c++11

76
推荐指数
9
解决办法
6697
查看次数

使用goto语句强制for循环的至少一次迭代的有效性

免责声明:我知道这是模糊的,我不会这样编程.我知道首选的do-while陈述,而不是那个,问题更多的是关于特定语言结构的有效性.


goto始终应该忽略条件表达式中的for循环?从我观察到它跳过第一个(即初始化)和第二个表达式.这总是会以这种方式发生,还是纯粹依赖于编译器?

#include <stdio.h>

int main(void)
{
    int m = 5;

    goto BODY;
    for (m = 0; m < 5; m++)
        BODY: puts("Message"); // prints "Message" once

    printf("m = %d\n", m); // prints m = 6

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c goto language-lawyer

20
推荐指数
2
解决办法
1108
查看次数

切换案例奇怪的范围

回顾一些第三方C代码我遇到了类似的事情:

switch (state) {
case 0: 
    if (c=='A') { // open brace
        // code...
    break; // brace not closed!
case 1:
    // code...
    break;
    } // close brace!
case 2:
    // code...
    break;
}
Run Code Online (Sandbox Code Playgroud)

在我正在审查的代码中看起来只是一个错字,但我很惊讶它编译时没有错误.

为什么这个有效的C?
与在预期位置关闭支撑相比,对此代码执行的影响是什么?
有什么情况可以使用吗?

编辑:在示例中,我查看了存在的所有中断(如上所述) - 但如果在0或1的情况下中断,则答案还可以包括行为.

c syntax switch-statement duffs-device

14
推荐指数
1
解决办法
1079
查看次数

switch-case语句没有中断

根据这本书,我正在读:

问:如果我在switch-case语句中省略了中断,会发生什么?

断言语句使程序执行能够退出切换构造.没有它,执行继续评估以下case语句.

假设我的代码看起来像

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    default:
    do C;
    break;
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着如果我选择案例1,A和C就完成了.如果我选择案例2,则完成B和C. 如果我不选择,那么只有C完成.

如果是这样,如果我们在做了C之后省略了休息会发生什么.

我认为这些是糟糕的编程习惯,但我很好奇会发生什么情况才能更深入地理解它是如何工作的.谢谢

c++ switch-statement

14
推荐指数
4
解决办法
4万
查看次数

C/Objective C中的switch语句

我是Objective-C的新手,但是从我所知道的关于switch语句的所有内容来看,下面的代码不应该打印任何内容,因为对我来说似乎应该有一个编译错误.但是打印出2.我不懂为什么.有人可以解释一下吗?

- (void) test {
    int myVar = 2;

    switch (myVar) {
        case 1:
        {
            NSLog(@"result: %d", myVar);
            break;

            case 2:
            {
                NSLog(@"result: %d", myVar);
            }
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c objective-c switch-statement

13
推荐指数
1
解决办法
1035
查看次数

如何在C中的switch case语句中使用范围?

我的逻辑是:

if number is between 1 to 10, execute first case statement
if number is from 20 to 30, execute second case statement
Run Code Online (Sandbox Code Playgroud)

有没有下面的解决方案?

case '1' ... '10':
case '20' ... '30':
Run Code Online (Sandbox Code Playgroud)

c switch-statement

11
推荐指数
3
解决办法
3万
查看次数

这个C代码做什么[Duff的设备]?

void Send(int * to, const int* from, const int count)
{
    int n = (count+7) / 8;
    switch(count%8)
    {
       case 0: do { *to++ = *from++;
       case 7:      *to++ = *from++;
       case 6:      *to++ = *from++;
       case 5:      *to++ = *from++;
       case 4:      *to++ = *from++;
       case 3:      *to++ = *from++;
       case 2:      *to++ = *from++;
       case 1:      *to++ = *from++;
        } while (--n>0);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++

10
推荐指数
4
解决办法
4997
查看次数

为什么案件陈述允许在另一个案件的内部?

我遇到过这样的代码:

  switch(i) {
    case 2: {
      std::cout << "2";
      break;
    case 3:
      std::cout << "3";
      break;
    }
    case 4: {
      std::cout << "4";
      break;
    }    
  }
Run Code Online (Sandbox Code Playgroud)

请注意,case 2打开一个带花括号的块,只有在后才会关闭case 3.起初,这似乎是一个错字导致编译器错误,或者更糟糕的是,忽略case 3.但它在c ++中运行得很好,如果我是3则输出3.我来自java背景,所以我对c ++中逻辑块的理解可能缺乏.所以我的问题是:这是故意的行为吗?

c++ switch-statement

9
推荐指数
2
解决办法
550
查看次数

如何编译Duff的设备代码?

我理解为什么Duff的设备比普通的循环代码更快,可以展开但没有优化.但我无法理解代码是如何编译的.
我想这是关于切换语法的一个技巧.但不是了.

怎样才能做到,而句子中存在开关句子?很奇怪.
有没有人可以解释这个?

编辑: 另一个问题.为什么duff使用8?它可能是16,65536或其他什么.因为代码大小?还有其他原因吗?例如,缓存或流水线操作的好处.

c c++ switch-statement duffs-device

6
推荐指数
2
解决办法
1663
查看次数