4

可能重复:
cout << c++ << c; 的正确答案是什么?

当我突然注意到时,我刚刚输出了文本。

#include <iostream>
int main()
{    
 int array[] = {1,2,3,4};                 
 int *p = array;

    std::cout << *p << "___" << *(p++) << "\n";
    // output is  1__1. Strange, but I used  brackets! it should be at
    // first incremented, not clear.
    p = array;


   std::cout << *p << "___" << *(++p) << "\n";
   // output is 2_2   fine, why first number was affected? I didn't intend 
   // to increment it, but it was incremented
   p=array;


   std::cout << *p << "___" << *(p + 1) << "\n";
   // output is 1_2 - as it was expected
   p = array;

 return 0;
}

这种行为对我来说很奇怪,为什么会这样?

4

1 回答 1

15

您正在导致未定义的行为,因此任何事情都可能发生,因此猜测原因毫无意义。

表达方式

std::cout<<*p<<"___"<<*(p++)<<"\n"

举个例子:之间所有事物的评估顺序<<是未指定的,因此*p*(p++)彼此之间没有顺序(即编译器不需要先做任何一个)。您不允许修改变量然后在没有修改和使用顺序的情况下使用它,因此这会导致未定义的行为。

同样的事情适用于该程序中的所有其他地方,其中变量被修改并在同一表达式中单独使用无序。

于 2012-09-29T14:12:47.813 回答