“理解”;“通用和统一初始化”;在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;