“理解”;“通用和统一初始化”;在C++; 我正在通过一本C++的书来教我自己。我正在读的那本书谈到了通过类型转换缩小范围。它解释了如何将double缩小为int,并说“如果您认为转换可能导致错误的值,您应该怎么做?使用{}初始值设定项以避免意外。”然后它给出了一个非常有限的示例代码,并且几乎没有上下文: double x{ 2.7 }; // OK int y(x); //error:double -> int might narrow

“理解”;“通用和统一初始化”;在C++; 我正在通过一本C++的书来教我自己。我正在读的那本书谈到了通过类型转换缩小范围。它解释了如何将double缩小为int,并说“如果您认为转换可能导致错误的值,您应该怎么做?使用{}初始值设定项以避免意外。”然后它给出了一个非常有限的示例代码,并且几乎没有上下文: double x{ 2.7 }; // OK int y(x); //error:double -> int might narrow,c++,casting,type-safety,uniform-initialization,C++,Casting,Type Safety,Uniform Initialization,我试着运行一些代码,以便了解它是如何工作的,但结果并不是我所期望的: double test {1.2}; cout << "First Line test = " << test << '\n'; test = 3 / 2; cout << "Test = " << test << '\n'; 我的阅读印象是,如果我在C++中这样做的话,它会达到同样

我试着运行一些代码,以便了解它是如何工作的,但结果并不是我所期望的:

    double test {1.2};
    cout << "First Line test = " << test << '\n';
    test = 3 / 2;
    cout << "Test = " << test << '\n';
我的阅读印象是,如果我在C++中这样做的话,它会达到同样的效果:

    double test {1.2};
    test = 3 / 2;

在C++中有不同的初始化格式

intx=10//复制初始化(不太可取)

inty=10 /值初始化/直接初始化(在旧的和新的C++中可用)< /P>
intz{10}//统一初始化/大括号初始化/列表初始化(与现代C++一起提供)

使用统一初始化的优点
  • 防止像您提到的那样缩小转换范围。但这不是使用统一初始化的唯一优点
  • 给一个关于最烦人的解析的小例子。当我们使用括号“()”进行初始化时,可能会混淆定义变量和定义函数。如果发生这种情况,编译器将优先考虑该函数。 我希望它会对你有用,祝你好运

  • 欢迎来到整数除法的奇妙世界:)(使用第二次重复中的答案进行修复)我的问题是关于使用“{}”的初始化,而不是关于整数除法。有人告诉我这个问题已经结束了,并给我指了一些文章,这些文章并没有回答我的问题。当我问一个问题时,我有什么做错了吗?“这个代码的结果是3/2被截断为1。”你的问题是为什么?对吗?我误解了什么吗?两篇链接文章都回答了这个问题。你可以回答你的问题,并更具体地解释为什么这些答案不符合你的答案。这就是问题所在。我很抱歉,我可能把它弄糊涂了。我的问题是更多关于这个问题:“从我读到的,如果我用{}而不是=版本”来初始化“双”测试,我会被印象深刻,我将阻止变量“test”被允许以后缩小到int。“我在很久以前在C上大学,所以C++对我来说是全新的。我在这本书中读到的内容让我想到,如果您使用“{}”初始化,那么它将保证结果将保持您初始化它时的类型。当我测试这个想法时,它不起作用。所以我问了更多关于“{}”部分的问题表达式
    3/2
    的结果是一个
    1
    类型
    int
    (不管该值接下来会发生什么),根据整数除法规则。当该值分配给
    double
    变量时,它将转换为
    double
    ,并变为
    1.0
    。因此,在分配
    test=3/2之后变量
    test
    保存类型
    double
    的值
    1.0
    。希望这有帮助。
        double test {1.2};
        test = 3 / 2;