这个问题在这里已有答案:
- ANSI C中的parens表达式包含复合语句(块)吗? 2个答案
- 警告“使用GNU语句表达式扩展” 4个答案
9078
2017-12-24 13:53
起源
把 int i=0; while(i<10) {++i;} i; 在一个被包围的街区内 ( ) 使printf像处理函数一样对待它。在和它读取最后一个并打印它。 - Michi
这在C中不起作用.C不支持重载 << 运营商。 - fuz
@FUZxxl 是什么让你这么说? - Michi
@Michi请阅读我的完整评论,而不仅仅是第一句话。 - fuz
顺便说一句,最后你可以使用lambda函数在标准C ++中获得(大部分)相同的结果并立即调用它: cout << ([](){int i=0; while(i<10) {++i;} return i;}()) << endl; (更换 [] 同 [&] 如果你需要引用周围函数的变量) - Matteo Italia
答案:
这是一个海湾合作委员会 延期:
括在括号中的复合语句可能显示为 在GNU C中表达
复合语句中的最后一件事应该是表达式 然后是分号;这个子表达式的值用作 整个结构的价值。
15
2017-12-24 13:57
@Borgleader:检查链接。 “此功能在使宏定义”安全“时非常有用(因此它们只能评估每个操作数一次)” - Karoly Horvath
@Borgleader:另外,因为在C ++中有些地方只允许表达式,而你经常想写“真正的”代码 - 想想成员初始化。 (更一般来说,声明/表达式dicothomy是完全人为的,经常妨碍,有一些方法来逃避它总是一件好事) - Matteo Italia
“声明/表达二分法完全是人为的” - 确实,它是语言设计的选择。与红宝石相比,在哪里 一切 是一个表达(伟大的表达能力),或python,这是非常严格的(=安全,可以捕捉潜在的问题,如= vs ==),c / c ++是在中间的某个地方,但绝对不是一个甜点。奇怪的逗号运算符是一个很好的证据,表明可疑的东西正在发生...... - Karoly Horvath