为什么我在 C++ 的语句表达式中得到“操作可能未定义”?

2024-04-18

为了简单描述问题,请看下面的代码:

int main()
{
    int a=123;
    ({if (a) a=0;});
    return 0;
}

我从 [-Wsequence-point] 收到此警告

Line 4: warning: operation on 'a' may be undefined

我的g++版本是4.4.5

我将不胜感激任何能解释这个简单问题的人。

顺便说一句,你可以在#7中找到我的原始程序和原始问题this http://bbs.csdn.net/topics/390475508中文网站(非必须)

UPD1:

虽然将代码更改为({if(a) a=0; a;})可以避免警告,但我认识到问题的真正原因可能不是The last thing in the compound statement should be an expression followed by a semicolon.

因为纪录片还说If you use some other kind of statement last within the braces, the construct has type void, and thus effectively no value.

一个例子可以说明这一点:

int main()
{
    int a=123, b;
    ({;});
    ({if (a) b=0;});
    return 0;
}

这段代码得到了没有警告! 所以我认为真正的原因是关于序列点的。

请帮忙!

UPD2:

很抱歉@AndyProwl 没有接受他在 UPD1 之前就被接受的答案。按照他的建议,我可能会问一个新问题(UPD1 是一个与原始问题不同的新问题)。我会再次接受他的回答,因为无论如何它肯定会避免警告。:)

如果我决定提出新问题,我将更新此问题以添加链接。


根据 C++ 语法,表达式(也许除了 lambda 表达式,但这是一个不同的故事)不能包含语句 - 包括块语句。因此,我想说你的代码格式不正确,如果 GCC 编译它,则意味着这是一个(奇怪的)编译器扩展。

您应该查阅编译器的参考,以找出它被赋予的语义(或未给出的语义,如错误消息似乎所暗示的那样)。

EDIT:

正如 Shafik Yaghmour 在评论中指出的 https://stackoverflow.com/questions/16838884/why-i-got-operation-may-be-undefined-in-statement-expression-in-c/16839419#comment24280775_16839419,这似乎是一个 GNU 扩展。根据文档 http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Statement-Exprs.html#Statement-Exprs,这个“语句表达式”的值应该是块中最后一个语句的值,它应该是一个表达式语句:

复合语句中的最后一项应该是一个表达式,后跟一个分号;该子表达式的值用作整个构造的值。 (如果您在大括号内最后使用某种其他类型的语句,则构造的类型为 void,因此实际上没有值。)

由于示例中的块不包含表达式语句作为最后一个语句,因此 GCC 不知道如何计算该“语句表达式”(不要与“表达式语句”混淆 - 这应该出现在语句表达式的最后) 。

因此,为了防止 GCC 抱怨,您应该执行以下操作:

({if (a) a=0; a;});
//            ^^

但老实说,我不明白为什么在 C++ 中需要这个东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我在 C++ 的语句表达式中得到“操作可能未定义”? 的相关文章

随机推荐