c++ - if 语句中的复合表达式

标签 c++ if-statement gcc

我偶然发现了执行此操作的能力。

#include <iostream>
using namespace std;

int main() {
    if ( ({int i = 1024; i == 10;}) ) {
        cout << "In" << endl;
    }
}

重要的反汇编区域好像是:

->  0x10000118f <+15>: movl   $0x400, -0x18(%rbp)       ; imm = 0x400 
    0x100001196 <+22>: cmpl   $0xa, -0x18(%rbp)
    0x10000119a <+26>: sete   %al
    0x10000119d <+29>: andb   $0x1, %al
    0x10000119f <+31>: movb   %al, -0x19(%rbp)
    0x1000011a2 <+34>: testb  $0x1, -0x19(%rbp)
    0x1000011a6 <+38>: je     0x1000011d9               ; <+89> at main.cpp:37

通过检查,它似乎确实将最后一条语句(比较 i == 10)作为 if 语句的 bool 值。

我知道这种情况不允许我在 if 语句中使用变量 i 因为作用域运算符,但想知道为什么 if 语句决定使用 i == 10 作为 bool 语句。

对于此的替代方案,我知道函数调用可能更清晰,它返回一个 bool 值,我可以使用它来设置 if 语句的变量。但是,我在 glibc 源代码中看到了扩展为这种非常相似样式的宏。

这是一种使用 MACRO 进行编程的旧风格吗?

我缺少这个有什么好处吗?

最佳答案

C++ 语言的 GCC 扩展允许将带括号的复合语句(即分号分隔语句、大括号内、圆括号内)用作表达式。为了对表达式求值,语句按顺序执行,最后一条语句中表达式的值作为整个表达式的值。

它主要用于需要声明自己的局部变量的类函数宏。因为它是特定于 GCC 的,所以除非绝对必要,否则最好避免使用它 — 在 C++ 的情况下,最好避免使用类似函数的宏本身,以支持模板函数。

所以知道它是一件好事,但在 C++ 中使用它并不是一件好事,即使在支持它的编译器上也是如此。

编辑:正如 Jodocus 指出的那样,C++17 中有一个类似的功能,即 for 循环式初始化程序可以在 if 语句中的条件之前(就像在 for 语句中一样)。我个人认为这是一个不必要的复杂化,因为它与将初始化程序和 if 语句放在大括号中的效果大致相同,但在您发布的代码中,它在技术上是一个有效的选项。

关于c++ - if 语句中的复合表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50353399/

相关文章:

c++ - QByteArray数据格式解释

c++ - cin 如何将字符转换为相应的类型

java - 好奇 if 条件和异常

c - 重定位被截断以适应 : R_X86_64_32

c++ - 如何解决这里的编译错误 - 对于 C++ 中的观察者模式?

excel - 有条件地比较值

php - 如何显示:none of data row in a for each array?

c++ - 防止 gcc 中的 std::function 分配内存或增加阈值

为较旧的 OS X 版本使用 gcc 从终端编译 C 程序

c++ - D 是否有类似于 C++0x 的 move 语义的东西?