if 语句中的复合表达式
Compound expression in if statement
我偶然发现了这样做的能力。
#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
语句的布尔值。
我知道这种情况不允许我在 if 语句中使用变量i
,因为范围运算符,但想知道为什么if
语句决定使用i == 10
作为布尔语句。
对于替代方案,我知道函数调用可能更干净,它返回一个布尔值,我可以用来设置为if
语句的变量。但是,我看到宏在 glibc 源代码中扩展到这种非常相似的样式。
这是一种使用宏编程的旧风格吗?
我错过了有什么好处吗?
C++语言的 GCC 扩展允许将带括号的复合语句(即分号分隔的语句、大括号内、括号内(用作表达式。为了计算表达式,语句按顺序执行,最后一个语句中表达式的值用作整个表达式的值。
它主要适用于需要声明自己的局部变量的类似函数的宏。因为它是特定于 GCC 的,所以除非绝对必要,否则最好避免使用它——在C++的情况下,最好避免使用类似函数的宏本身,而支持模板函数。
所以这是一件好事,但在C++中使用也不是一件好事,即使在支持它的编译器上也是如此。
编辑:正如Jodocus所指出的,C++17中有一个类似的功能,其中for循环样式的初始值设定项可以在if语句中的条件之前(就像在for语句中一样(。我个人认为这是一个不必要的复杂化,因为它与将初始值设定项和 if 语句放在大括号中的效果大致相同,但在您发布的代码中,它在技术上是一个有效的选项。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- C++模板函数中的初始化 - 新的初始值设定项表达式列表被视为复合表达式
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- 复合赋值的左侧表达式是未初始化的值.计算出的值也将是垃圾
- if 语句中的复合表达式
- C 套接字误差(新的初始器表达式列表被视为复合表达式)
- 错误:表达式列表在初始化器[-fpermissive] Double Paycalc(p,yir,y)中被视为复合表达式
- 可变模板:表达式列表在函数转换错误中被视为复合表达式
- 表达式列表被视为复合表达式
- 将提升 lambda 与复合表达式结合使用
- 表达式列表在初始化器中被视为复合表达式
- 表达式列表在创建指向 Mat 向量的指针时被视为初始值设定项中的复合表达式
- 函数强制转换中作为复合表达式处理的表达式列表[-fpermissive]