C++ C++;返回中的类型转换优先级

C++ C++;返回中的类型转换优先级,c++,types,stl,casting,type-conversion,C++,Types,Stl,Casting,Type Conversion,我有一段代码被改为以64位模式编译,因为各种原因,以前它是在Win32中编译的。这导致了一些清理工作,以解决一些警告,所以我正在挑选代码,并发现一些类似于以下内容: class foo { public: int foo() { return data_.size()-1; } private: std::vector<int> data_; }; class-foo { 公众: int foo(){return data_uz.size()-1;} 私人:

我有一段代码被改为以64位模式编译,因为各种原因,以前它是在Win32中编译的。这导致了一些清理工作,以解决一些警告,所以我正在挑选代码,并发现一些类似于以下内容:

class foo 
{

public:
    int foo() { return data_.size()-1; }

private:
    std::vector<int> data_;
};
class-foo
{
公众:
int foo(){return data_uz.size()-1;}
私人:
std::矢量数据;
};
STL容器上的size()方法返回无符号值。返回值被转换成带符号的整数值,因此在某个时刻会发生转换

不过,我不确定这里的优先顺序。size()返回的值是否会转换为int,然后减去1,如果size为零,则返回值将为-1?或者我们会从一个无符号int中减去1,如果调用时容器是空的,可能会做坏事吗


谢谢

你的第二个猜测是正确的。一般来说,对表单的任何表达式求值

exp1 op exp2
在步骤中工作

  • 评估
    exp1
  • 评估
    exp2
  • exp1
    exp2
    的值应用
    op
  • 注意:步骤1和2可以按任意顺序进行。关键是在应用运算符之前对每个操作数求值


    因此在这种情况下,
    exp1
    将首先计算为
    无符号int
    值,可能会产生不良影响。

    您的第二个猜测是正确的。一般来说,对表单的任何表达式求值

    exp1 op exp2
    
    在步骤中工作

  • 评估
    exp1
  • 评估
    exp2
  • exp1
    exp2
    的值应用
    op
  • 注意:步骤1和2可以按任意顺序进行。关键是在应用运算符之前对每个操作数求值

    因此,在这种情况下,
    exp1
    将首先计算为一个
    无符号int
    值,可能会产生不良影响。

    数据大小()-1
    计算为无符号整数时。当
    data.size()
    0
    时,函数可能返回非常大的正数,而不是
    -1

    您的最佳选择:

    int foo() { int s = data_.size(); return s-1; }
    
    数据大小()-1
    被计算为无符号整数时。当
    data.size()
    0
    时,函数可能返回非常大的正数,而不是
    -1

    您的最佳选择:

    int foo() { int s = data_.size(); return s-1; }
    

    下一个程序返回
    i=-1
    std::numeric_limits::max()
    的位模式是
    int
    -1
    中的一个。这就是代码在w32中工作的原因

    #包括
    #包括
    int main(){
    
    std::cout下一个程序返回
    i=-1
    std::numeric\u limits::max()
    的位模式是
    int
    -1
    之一。这就是代码在w32中工作的原因

    #包括
    #包括
    int main(){
    
    如果大小为0,则结果不是-1,而是一个非常大的整数“18446744073709551615”(无符号(最大))

    #包括
    #包括
    int main()
    { 
    std::向量nums{};
    
    如果大小为0,则结果不是-1,而是一个非常大的整数“18446744073709551615”(无符号(最大))

    #包括
    #包括
    int main()
    { 
    std::向量nums{};
    
    std::cout它将是unsigned=unsigned-1;返回signed(unsigned),其中unsigned(0)-1==unsigned(max)

    从4.7积分转换

    整数类型的prvalue可以转换为其他类型的prvalue 整数类型。非范围枚举类型的PR值可以是 已转换为整数类型的prvalue。如果目标类型为 无符号,结果值为最小无符号整数全等 到源整数(模2n,其中n是用于 表示无符号类型)。[注:在2的补码中 表示,此转换是概念性的,没有任何更改 在位模式中(如果没有截断)。-结束注释]如果 目标类型已签名,如果可以,则该值不变 在目标类型(和位字段宽度)中表示;否则, 该值由实现定义。


    因此,任何大于最大有符号值的无符号值都会导致实现定义的行为。

    它将是unsigned=unsigned-1;返回有符号(unsigned),其中unsigned(0)-1==unsigned(max)

    从4.7积分转换

    整数类型的prvalue可以转换为其他类型的prvalue 整数类型。非范围枚举类型的PR值可以是 已转换为整数类型的prvalue。如果目标类型为 无符号,结果值为最小无符号整数全等 到源整数(模2n,其中n是用于 表示无符号类型)。[注:在2的补码中 表示,此转换是概念性的,没有任何更改 在位模式中(如果没有截断)。-结束注释]如果 目标类型已签名,如果可以,则该值不变 在目标类型(和位字段宽度)中表示;否则, 该值由实现定义。


    因此,任何大于最大有符号值的无符号值都会导致实现定义的行为。

    它将是无符号=无符号-1;返回有符号(无符号),其中无符号(0)-1==无符号(最大值);它将是无符号=无符号-1;返回有符号(无符号),其中无符号(0)-1==无符号(最大值)此链接已强制转换为int。请看我的链接。我添加了一个到
    int
    (如OP所做)的转换,得到了
    -1
    ,是的,它是正确的。您将类型强制转换从无符号int添加到int。原始代码具有
    返回数据_uuu.size()