【问题标题】:How to decorate a conditional statement to be an expression?如何将条件语句修饰为表达式?
【发布时间】:2011-02-16 14:54:44
【问题描述】:

我想用条件语句作为表达式,如下图,怎么做?

0, (do {a++;} while (a > 100););

编辑,我想这样做的原因是我想在现有表达式中添加一个条件语句以进行调试,现有表达式位于头文件中并包含在许多源文件中。例如,当前面的表达式达到某个特殊值时,我想编写一些调试消息。

【问题讨论】:

  • 能多解释一下吗?
  • 即使你能做到,我也会因此而伤害你。
  • 你是否觉得你的代码没有足够的混淆,仍然可以被其他程序员轻松阅读?还是您误以为将更多指令塞进更少的代码行可以让您的程序神奇地运行得更快?
  • @Thomson:我正在尝试按照您编辑中的说明进行操作...您在头文件中有表达式吗?如#define EXPR ++x + 2 * y 之类的,客户端代码ala fn(EXPR)?如果是这样,也许您可​​以通过调用函数来更改 EXPR?
  • @Tony,你是对的,把多余的表达式放在前一个的末尾会在某些情况下(比如你的)有一些副作用,我可以把多余的 exp 放在前面这种情况下的前一个表达式。感谢您指出。

标签: c++ c


【解决方案1】:

您根本不能在标准 C++ 中的表达式中包含 do-while 语句(有一个 GCC 特定的扩展 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html)。但你真正想要达到什么目的? - 我们或许可以找到一个优雅的替代方案...

在 C++0x 中,你可以接近,唉...

#include <iostream>

int main()
{
    int a = 10;
    std::cout << (([&]() -> int { do { a--; } while (a > 10); return a; })()) << '\n';
}

【讨论】:

  • 当 lambda 包含多个 return 语句时,您必须指定它的返回类型,否则返回类型为 void。 (N3225 §5.1.2p4)
  • @Fred:好点...奇怪的 GCC 4.5.2 没有抱怨:-/。上面已修复...谢谢。
【解决方案2】:

只需将其放入 inline 函数中即可。这适用于 C++ 和 C99。如果您有特殊的东西需要在调用者的位置进行评估,请将调用包装到一个宏中,该宏会完全执行您需要的评估。

【讨论】:

    【解决方案3】:

    我想这样做的原因是我想将条件语句添加到现有表达式以进行调试,现有表达式位于头文件中并包含在许多源文件中。例如,当前面的表达式达到某个特殊值时,我想编写一些调试消息。

    使用函数。如果您想在标题中定义它,请将其标记为内联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多