[英]Pre / Post Increment Explanation
请对我很轻松,不要拍我,因为我还是新手。
当我运行这段代码时,我完全感到困惑,无法终身解决原因:
int y = 9;
cout << "++y = " << ++y << "\n--y = " << --y << "\ny++ = " << y++ << "\ny-- = " << y-- << "\n";
cout << "y = " << y << "\n";
我得到以下结果:
y = 9
++y = 9
--y = 9
y++ = 8
y-- = 9
y = 9
而不是这些结果:
y = 9
++y = 10
--y = 9
y++ = 9
y-- = 10
y = 9
我从这段代码得到的:
int y = 9;
cout << "y = " << y << "\n";
cout << "++y = " << ++y << "\n";
cout << "--y = " << --y << "\n";
cout << "y++ = " << y++ << "\n";
cout << "y-- = " << y-- << "\n";
cout << "y = " << y << "\n";
任何人都可以解释 - 尽可能简单的单词 - 在第一个代码中会发生什么,以便以这种方式打印结果?
一个简单的规则是,您不应该在任何给定语句中多次增加相同位置。 所以你不应该编码cout << y++ << ++y << endl;
其中包含两个y
增量(假设为int y;
声明)。
有关详细信息,请阅读C ++标准中的序列点和未定义行为 。
有很多相关的问题。 仔细研究它们!
当根据规则操作*要在+之前计数,而++之前计算*时,它将是如此。
a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c
但是当你有一个++ * a--时, 没有人能够说出,两个操作数中的哪一个,一个++或一个 - 将被评估为第一个。 根据ANSII标准,即使您使用相同的翻译器,结果也是每次都无法预测。
引用C ++ ANSII标准:
除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的。 在上一个和下一个序列点之间,标量对象的表达式评估最多只能修改一次存储值。 此外,只能访问先前值以确定要存储的值。 对于完整表达的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义。 [例:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9
i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
序列点:
所以,|| 是一个序列点,但<<不是。
Mulitiline版本的第一个代码应该是:
y = 9;
cout << "y-- = " << y-- << "\n";
cout << "y++ = " << y++ << "\n"
cout << "--y = " << --y << "\n"
cout << "++y = " << ++y << "\n"
cout << "y = " << y << "\n";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.