C++ 不可预测的布尔比较c++;

C++ 不可预测的布尔比较c++;,c++,comparison,boolean,C++,Comparison,Boolean,为什么这个代码会产生看似随机的行为 std::cout << ( thePointerIsGood = ( NULL != (aPointer = aFunctionThatReturnsAPointer(args)) ) ); 它为我生成以下输出(应该说是预期的) 我认为以下是未定义的行为: std::cout << ( (theValueMatches = ((*aPointer) == 222)) ? "Y

为什么这个代码会产生看似随机的行为

std::cout << ( thePointerIsGood = ( NULL != (aPointer = aFunctionThatReturnsAPointer(args)) ) );
它为我生成以下输出(应该说是预期的)


我认为以下是未定义的行为:

std::cout << ( (theValueMatches = ((*aPointer) == 222))
                            ? "Y  "
                            : "N  "
                            )
                         << ( (theValueMatches == true)
                            ? "expected"
                            : "unexpected"
                            )
                         << std::endl
                         ;

std::cout我认为以下是未定义的行为:

std::cout << ( (theValueMatches = ((*aPointer) == 222))
                            ? "Y  "
                            : "N  "
                            )
                         << ( (theValueMatches == true)
                            ? "expected"
                            : "unexpected"
                            )
                         << std::endl
                         ;

std::cout表达式的求值顺序没有保证。如果您有:

x << (a = b) << a;

x表达式的求值顺序没有保证。如果您有:

x << (a = b) << a;

x是否
args
以任何方式引用了
aPointer
和/或
pointerisgood
a函数是否返回指针
?请告诉我们实际的代码为什么在给cout变量之前还要给它赋值?我不是C++标准专家,但这可能导致CUT接收分配的结果,而不是分配给什么。这也解释了为什么将它移动到多行可以让一切正常工作。如果您下定决心要让这个代码片段正常工作,我会浏览一下标准,看看cout行为是如何定义的。更重要的是,看看是否有任何特定的条件导致cout的未定义行为。@pg1989-首先,我根本不知道cout是如何关联的。至于变量,他解释了他为什么要分配一个变量,(除非
操作符=
被严重滥用,
a=b
的值等于
b
,其副作用是分配给
a
。这确实是一个有趣的问题。@Manish-我称之为“严重滥用”的
args
是否以任何方式指的是
aPointer
和/或
thePointerIsGood
a函数是否返回指针
?请告诉我们实际的代码为什么在给cout变量之前还要给它赋值?我不是C++标准专家,但这可能导致CUT接收分配的结果,而不是分配给什么。这也解释了为什么将它移动到多行可以让一切正常工作。如果您下定决心要让这个代码片段正常工作,我会浏览一下标准,看看cout行为是如何定义的。更重要的是,看看是否有任何特定的条件导致cout的未定义行为。@pg1989-首先,我根本不知道cout是如何关联的。至于变量,他解释了他为什么要分配一个变量,(除非
操作符=
被严重滥用,
a=b
的值等于
b
,其副作用是分配给
a
。这确实是一个有趣的问题。@Manish-我称之为“严重虐待”,答案似乎同意这一点。这对我来说是有意义的。我现在明白了它是如何被含糊不清地解释的。问题根本不是我文章的第一部分,而是后面的这一部分。我不认为我会像你刚才所说的那样考虑这个声明。谢谢我的代码是以每次都能正常工作的方式编写的,但我真的很好奇为什么这种方式不起作用。的答案似乎同意这一点。这对我来说是有意义的。我现在明白了它是如何被含糊不清地解释的。问题根本不是我文章的第一部分,而是后面的这一部分。我不认为我会像你刚才所说的那样考虑这个声明。谢谢我的代码是以每次都能正常工作的方式编写的,但我真的很好奇为什么这种方式不起作用。
x << (a = b) << a;