C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了创建C整数类,使其与整数整数类型完全相同大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
几天前我见过的那个小而且非常讨厌的问题,在接受采访时问我的朋友.

最初的面试问题是:“以下代码输出是什么?”

int i = 2;
i = i++ + i++;

正确答案是((2 2)1)1 = 6,即在赋值之前两次应用后增量,但是在加法之后.

然后我想创建一个带有一个整数的简单类,并重载operator()和operator(int),以便在日志中查看执行操作符的确切顺序.

这就是我得到的:

class A
{
public:
A(int _data) : data(_data) { }

A &operator=(const A& _rhs)
{
    data = _rhs.data;
    cout<<" -- assign: "<<data<<endl;
}

A operator++(int _unused)
{
    A _tmp = data;
    data++;

    cout<<" -- post-increment: "<<data<<endl;
    return _tmp;
}

A operator+(const A &_rhs)
{
    A _tmp = data + _rhs.data;

    cout<<" -- addition: "<<data<<"+"<<_rhs.data<<endl;
    return _tmp;
}

inline operator int() const { return data; }

private:
    int data;
};

结果非常令人沮丧:

-- post-increment: 3
-- post-increment: 4
-- addition: 3+2
-- assign: 5

对于不太复杂的构造,例如(A _dt2 = a;),它应该按原样运行,但是运算符执行的顺序不是整数类型.

它可能是编译器特定的问题,我想:

$gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation,Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITnesS FOR A PARTICULAR PURPOSE.

所以,我有点失落:)

解决方法

int i = 2;
i = i++ + i++;

正确答案是undefined behaviour,因为您正在多次修改一个变量,而中间没有序列点.

C 03标准§5[expr] p4:

这可能无法解答您的真实问题,但即使您创建类似整数的类并重载运算符(int)和运算符(A const&),它也会类似.函数的参数的评估顺序是未指定的,它可以按编译器喜欢的任何顺序完成,因此结果未指定.

大佬总结

以上是大佬教程为你收集整理的创建C整数类,使其与整数整数类型完全相同全部内容,希望文章能够帮你解决创建C整数类,使其与整数整数类型完全相同所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。