Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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++ ';int i=0';与';int i(0)和#x27;在';对于';循环(分配与初始化计数变量)_C++ - Fatal编程技术网

C++ ';int i=0';与';int i(0)和#x27;在';对于';循环(分配与初始化计数变量)

C++ ';int i=0';与';int i(0)和#x27;在';对于';循环(分配与初始化计数变量),c++,C++,我在教科书和论坛上看到过很多代码,人们在for循环中使用赋值运算符而不是初始化运算符来开始重复。比如说, for ( int i = 0; i < 5; ++i ) // common for ( int i(0); i < 5; ++i ) // uncommon (int i=0;i对象,值为代码> 0 。它们是严格等价的,两个循环构造也是如此。注意,在C中,inti(0)是不允许的构造。您提到的两种初始化形式是:- T t = u; _1 T t(u);

我在教科书和论坛上看到过很多代码,人们在
for
循环中使用赋值运算符而不是初始化运算符来开始重复。比如说,

for ( int i = 0; i < 5; ++i )   // common 
for ( int i(0);  i < 5; ++i ) // uncommon 
(int i=0;i<5;++i)的
for//common
for(int i(0);i<5;++i)//不常见

我知道初始化变量要比赋值快。为什么人们更喜欢前者而不是后者?

两者
inti=0
inti(0)在C++中声明、定义和初始化一个代码< int >代码>对象,值为代码> 0 。它们是严格等价的,两个循环构造也是如此。注意,在C中,
inti(0)是不允许的构造。

您提到的两种初始化形式是:-

T t = u;     _1
T t(u);      _2
_一,

这可能涉及两个电话。一个是转换构造函数,另一个是复制构造函数。尽管大多数编译器可以省略复制构造

_二,

这只需要对转换构造函数进行一次调用


因此,_2比_1更可取。至于内置类型,它不会有太大区别。

在C编程语言中,必须首先定义变量,然后初始化它们。要执行for循环,您需要在函数的开头定义变量,然后才能写入for(i=0;i您可以写入的is以及:

int i(5);

所有这些都是初始化,而不是赋值。

*它们没有什么不同。

“我知道初始化变量比赋值快。”嗯,什么?这两种形式都是变量初始化,第一种不是赋值。这不是赋值运算符。:
int I=0
是初始化(尽管使用了
=
),而
I=0
则是赋值。当你在同一行声明变量时,它是初始化,而不是赋值。很快你就会来到你附近的一家剧院:
for(inti{0};i<5;++i)
@CroCo你混淆了两件事。你似乎认为
tu=v
u=v相同(或
tu;u=v;
),而它们不是。你问题的基本前提是错误的,因为你所写内容的两个版本都是相同的,正如所解释的。@CroCo还请注意,像
image1(image2)
这样的结构根据上下文可能有不同的含义。这可以是函数调用,也可以是构造函数。您的示例看起来像一个函数调用和赋值运算符。然而,如果你把类型放在(
T image(image2);
T image=image2;
)之前,它们都会成为复制构造器(假设两个图像都是同一类型的
T
)。在C++之前学习C的人可能更喜欢前者,因为它的熟悉性。有时它们更好。有关更多详细信息,请参阅。@AerofoilKite可能第一个版本更为惯用,因为它更接近C89 for loop
for(i=0;i<5;++i)
@Rinzler:对于像这样的简单类型,括号初始化与其他样式是等效的,没有特别的理由喜欢其中任何一种。它有多种用途,包括避免“最麻烦的解析”(例如,
inti();
不声明变量,但
inti{};
声明变量),以及像
std::vector
这样的类允许从元素列表初始化。@MikeSeymour:
inti()不是“最烦人的解析”。嗯。。。如果你写
inti;对于(i=0;严格来说,这都是正确的,但是你对这个问题的应用并不完全正确。这两个结构是相同的,因为它们是相同的,而不是因为它们是在循环的第一次迭代之前创建的。“要执行for循环,您需要在函数的开头定义变量,然后才编写
for(i=0;iIn-practice,尤其是
u
T
时,这些副本将被完全忽略。为什么这个答案会被否决?如果有一个构造函数支持
T(u);
,在这种特殊情况下,
T T=u;
不会涉及2次调用。它将调用构造函数或复制构造函数。如果不是这样,请发布一个示例,我将撤销投票。我只是尝试使用gccIf没有编译器,那么这种答案应该通过引用标准来支持。还请注意,引用nce改为“内置类型不会有太大区别”没有帮助,可能会让OP感到困惑。如果语句_1为真,那么它将调用两个类似构造函数的内置类型调用,而这本身将产生微小的差异。@Kiran:如果禁用复制省略,任何编译器都可能调用
_1
的复制构造函数。如果它选择这样做,则可能不会删除副本,因为这是一种情况(从相同类型的临时文件初始化对象)在允许优化的地方。在
\u 2
中,直接初始化不会调用复制构造函数。对于类类型,答案是正确的;并且,正如它所说,对于普通类型,没有什么区别。如果复制构造函数是私有的,g++4.8.3不会编译第一个示例,而是编译第二个示例。(这似乎是正确的行为,但我还没有阅读标准-VS2013编译了这两种情况)。我想说,这是一个更重要的区别,而不是一个轻微的性能差异。它们都不是赋值。
int i{5};
int i=5;