我有一种情况,我希望 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) 每个人都会遇到这个问题:
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结构吗?
for(const auto& item : items) {
cout << item;
} and_between …Run Code Online (Sandbox Code Playgroud) 免责声明:我知道这是模糊的,我不会这样编程.我知道首选的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代码我遇到了类似的事情:
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的情况下中断,则答案还可以包括行为.
根据这本书,我正在读:
问:如果我在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之后省略了休息会发生什么.
我认为这些是糟糕的编程习惯,但我很好奇会发生什么情况才能更深入地理解它是如何工作的.谢谢
我是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) 我的逻辑是:
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) 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) 我遇到过这样的代码:
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 ++中逻辑块的理解可能缺乏.所以我的问题是:这是故意的行为吗?
我理解为什么Duff的设备比普通的循环代码更快,可以展开但没有优化.但我无法理解代码是如何编译的.
我想这是关于切换语法的一个技巧.但不是了.
怎样才能做到,而句子中存在开关句子?很奇怪.
有没有人可以解释这个?
编辑: 另一个问题.为什么duff使用8?它可能是16,65536或其他什么.因为代码大小?还有其他原因吗?例如,缓存或流水线操作的好处.
c ×6
c++ ×6
duffs-device ×2
c++11 ×1
goto ×1
idioms ×1
if-statement ×1
objective-c ×1
separator ×1
syntax ×1