Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 操作员<<;:标准::cout<&书信电报;我<&书信电报;(i<;1);_C++ - Fatal编程技术网

C++ 操作员<<;:标准::cout<&书信电报;我<&书信电报;(i<;1);

C++ 操作员<<;:标准::cout<&书信电报;我<&书信电报;(i<;1);,c++,C++,我使用stream操作符YourYourWell(mWell)(m因为int因为int你的第二个例子是未定义的行为 您已经定义了您的第二个示例是未定义的行为 您定义是因为是因为因为m是myInt您的第二个示例可以重写为: std::cout << m << " " << (m.operator<<( 1)) << std::endl; std::cout因为m是myInt你的第二个例子可以改写为: std::cout <<

我使用stream操作符YourYourWell(mWell)(m因为int因为int你的第二个例子是未定义的行为


您已经定义了
您的第二个示例是未定义的行为


您定义
是因为
是因为
因为
m
myInt
您的第二个示例可以重写为:

std::cout << m << " " << (m.operator<<( 1)) << std::endl; 

std::cout因为
m
myInt
你的第二个例子可以改写为:

std::cout << m << " " << (m.operator<<( 1)) << std::endl; 

<代码> STD::CUT> P> C++语言没有定义算子的评价顺序,只定义了它们的结合性。
<>由于你的结果取决于<>代码>运算符> P>,C++语言没有定义算子的评价顺序,只定义了它们的关联性。
由于您的结果取决于
操作的时间,因此您突出显示了问题,但“答案”的行为未定义。您突出显示了问题,但“答案”的行为未定义。几乎是:。的副本。在大多数实际用途中,它们是相同的,即使使用“+”而不是@杰瑞·科芬:它们非常相似,但几乎都是:。在大多数实际应用中,它们是相同的,尽管它们使用了“++”而不是@Jerry Coffin:它们非常相似,但是有一个完整的但重载的操作符是函数调用。有很多序列点。
std::cout也许你应该更新你的答案,因为如果没有你评论中的解释,那么很明显,没有一个序列点不能保证在它们之间没有一个他使用了关键的表达式。是的,由§1.9/17保证,因为每次调用的结果都为下一次调用提供了一个参数。@Tyler:严格来说,这不是未定义的行为,而是未指定的行为。有细微的区别(在这里不是特别有用),但有一点不同的是,编译器不允许生成“崩溃”代码。编译器必须生成一些操作顺序,即使这些操作的顺序从一次执行到下一次执行可能不同。但是重载运算符是函数调用。有很多序列点。
std::cout也许您应该更新e你的答案,因为没有你评论中的解释,很明显,许多序列点都不能保证关键表达式之间没有一个。是的,由§1.9/17保证,因为每次调用的结果都为下一个调用提供了一个参数。@Tyler:严格地说,这不是未定义的行为,这是不具体的ied。有细微的区别(这在这里不是特别有用),但有一点不同的是,编译器不允许生成“崩溃”代码。编译器必须生成一些操作顺序,即使每次执行的顺序可能不同。
class myint {
    int i;
public:
    myint(int ii) {
        i = ii;
    }
    inline myint operator <<(int n){
        i = i << n;
        return *this;
    }
    inline operator int(){
        return i;
    }
};
std::cout << i << " " << (i <<= 1) << std::endl;   //8 8
std::cout << m << " " << (m << 1) << std::endl;  
myint operator<< (int n) const
{
   return myint(this->i << n);
}
std::cout << m << " " << (m.operator<<( 1)) << std::endl; 
inline myint operator <<(int n) const { // ensure that "this" doesn't change
    return i << n; // implicit conversion: call myint::myint(int)
}