C++ std11中是否有类似于Python的`pass`的等效语句?

39

4
问题在于你滥用三目运算符作为 if。三目运算符是一个返回值的表达式,而不是 if 的简写。如果你在类似 C++ 中使用像这样的代码:x > y ? getInt() : getString(),你会遇到许多不同的问题。因此,你应该学习正确的编程惯用语,而不是简单地将你的代码翻译过来。 - David Rodríguez - dribeas
4
如何在三元表达式中使用pass(这也是Python中的一个错误),更重要的是为什么要这样做,而不是只使用if (condition) do_something(); - Joran Beasley
1
使用真实的占位符,例如 do_something_else() - Joran Beasley
2
@Tommy:不,人们喜欢指出这不是一个足够好的借口。 - Lightness Races in Orbit
2
@Tommy:cplusplus.com不是官方网站,也不具有权威性,在C++社区中甚至不是特别受人尊重。此外,那些论坛帖子是由完全的陌生人编写的。(事实上,该帖子并没有说明你正在尝试使用条件运算符的方式。)如果您喜欢,可以引用随意的观点,但是这里的专家们正在告诉您,通过同行评审,这些观点是错误的。也许听取这些建议会更好。 - Lightness Races in Orbit
显示剩余6条评论
7个回答

54

一个空语句(只有分号),或者空括号应该适用于您的情况

例如Python中的

while some_condition():    # presumably one that eventually turns false
    pass

可以翻译成以下的C++代码:

while (/* some condition */)
    ;

或者

while (/* some condition */) {}

也许对于三元运算符的情况,你可以这样做:

x > y ? do_something() : true;

2
供参考,第一个被称为空语句。 - chris
@Tommy:这就引出了一个问题,你真正期望条件运算符做什么。似乎运算符的作用和你的期望不一致。 - David Rodríguez - dribeas
6
@Tommy -- "pass" 在 Python 的条件表达式中也无法使用,例如 1 if True else pass 是无效的。 - mgilson
1
好的,如果你想不带任何修饰地提出问题,那么不,C++在所有语义结构中都没有像pass这样的东西。 - Prashant Kumar
_nop?这不是在std c中吗? - Joran Beasley
显示剩余2条评论

13

不,你没有 pass 或等效的 关键字。但是你可以写出等效的代码,而不需要任何这样的关键字。

def f():
   pass

成为

void f() {}

 class C:
     pass

成为

 class C {};

在不同的情境中,不同的语法可能会有用。例如,

 class MyError(Exception):
        pass

变成

class MyError : public std::exception
{
      using std::exception::exception; //inherits constructor!
};

正如您所见,在此上下文中,您必须编写using以从基类继承构造函数。 在Python中,pass在类似的上下文中执行类似的操作。

希望这有所帮助。


1
你不能把这个写在一个函数里。 - Reda Drissi

5
正如评论中所述,这是不被支持的,因为它没有任何意义。条件运算符被设计成计算两个操作数之一。两个,不是一个。
滥用运算符在其中一个情况下执行某些条件操作是不可取的。事实上,最好是两个操作数都没有任何副作用。这不是一个“做某事”的结构,而是一个“给我两个东西中的一个”的结构。
在这方面,如果Python支持你所说的支持,那么它将是有问题的,而C++则不会。事实上,Python实际上也不支持它。
相反,请编写一个if语句:
if (x > y) {
   do_something();
}
else {
   /* Unimplemented at the moment */
}

1
是的,它是有效的。但这并不意味着这是一个好主意,也不是运算符的预期用法。你似乎执意要写不清晰、难以维护的代码。 - Lightness Races in Orbit
@Tommy:很遗憾,你没有支付足够的费用让我撰写一篇关于代码风格优点及其原因的学术论文。 - Lightness Races in Orbit
3
简而言之,预期的语义是不同的。if/else 块传达了在两个动作之间进行选择的意图,而条件运算符则传达了在两个之间进行选择的意图。这就是为什么条件运算符返回一个值,而 if/else 块则不返回任何值的原因。 - Ian McLaird
1
@Tommy:我并不是在为什么辩护,我只是陈述了一个事实。而且我已经在我的回答中说了Ian所说的话:“这不是一个“做某事”的结构,而是一个“给我两个东西中的一个”的结构。” - Lightness Races in Orbit
1
Python并没有出错,它也不允许你在三元表达式中使用pass。 - Joran Beasley
显示剩余2条评论

4

我知道这听起来太荒谬了,但你可以考虑使用 "nop" 指令。

在Linux中

void pass()
{
    __asm__("nop");
}

在Windows中
void pass()
{
    __asm{nop};
}

3
如@bboonn所建议的:
 if (some_flag)
   ; // Do nothing

 else if (some_other_flag)
   do_something();

3
我认为在C++中,只需要一个空行(;)就可以相当于'pass'。

1
void f() { ; }
void g() { }
void h() { __asm__("nop"); }

所有结果几乎产生相同的汇编输出(x86 64)。

fg都会产生:

push    rbp
mov     rbp, rsp
nop
pop     rbp
ret

g 给出时

push    rbp
mov     rbp, rsp
nop
nop
pop     rbp
ret

(多了一个nop

在我的测试中,似乎仅包含__asm__("nop")的循环比;慢大约50%。

当使用-O1标志或更高版本时,情况仍然如此 - fg变成

ret

并且 h 变成了

nop
ret

当使用循环时,例如for(;;){}__asm__仍然会添加一个额外的指令,这是可以理解的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接