C++ 标准对单个if语句中单个变量的双重比较有何规定?

C++ 标准对单个if语句中单个变量的双重比较有何规定?,c++,C++,我在Visual Studio 2013上尝试了以下代码: int main() { int x = 5; if(4 < x < 6) { return 1; } return 0; } intmain() { int x=5; 如果(4代码> C,并且 BOOL被升级到int >代码>,用于后续比较,给出值 0 < /C>或 1 < /COD>,始终.< /P> 由于0和1都小于6,因此条件始终为真。本·沃伊特的回答当然是正

我在Visual Studio 2013上尝试了以下代码:

int main()
{
    int x = 5;
    if(4 < x < 6)
    {
        return 1;
    }
    return 0;
}
intmain()
{
int x=5;
如果(4
它在ideone上产生运行时错误,但在VS上工作得非常好


标准对这种不一致行为有何规定。我知道有编译警告,但我想知道为什么这不是天生的/官方支持的?

这是C和C++中的有效代码,但不符合你的意思。这与:

bool temp = (4 < x);
if (temp < 6) // always true
     return 1;  // this is EXIT_FAILURE
// dead code here returning EXIT_SUCCESS
bool-temp=(4

原始类型关系运算符的结果为:代码> BoOL < /C> >(C++中,<代码> int >代码> C,并且<代码> BOOL被升级到int >代码>,用于后续比较,给出值<代码> 0 < /C>或<代码> 1 < /COD>,始终.< /P>


由于
0
1
都小于
6
,因此条件始终为真。

本·沃伊特的回答当然是正确的,但我想解决问题的“运行时错误”部分:


它在Visual Studio中的效果与在ideone上的效果一样好。VisualStudio具有相同的返回值;它只是不像ideone那样大声抱怨。

你检查过VS上的返回值了吗?它应该返回1。它在ideone上运行良好。“运行时错误”表示您的程序从
main
返回的值不是
0
。也就是说,您的程序正在报告有错误。是否保证按该顺序执行?如果是这样的话,这是有意义的,但是优化编译器是否可以决定执行
bool temp=(x<6);如果(4
取而代之?@wolfPack88:顺序由关联性规则保证。如果你有
f()
你不知道是
f()
还是
g()
首先被调用,但是
x
会被与
f()
的结果进行比较。可能应该补充一点,如果(4stdlib.h中的
EXIT\u SUCCESS
被定义为
0
,而该代码采用另一个分支。