用C++处理输出表达式
Processing Output expression in C++
我有下面的简单程序,它初始化三个变量的值,然后以表达式的形式给出输出。
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
volatile int a = 10, b = 20, c = 30;
cout << a+b+c << " " << (c=c*2) << " "<< (b =b*2);
getch();
return 0;
}
以上代码的输出是
110 60 40
但是a=10,b=20
和c=30
,所以a+b+c
应该是10+20+30 = 60
这是因为函数的参数是从右到左处理的,但却是从左到右打印的。
在C++中,函数参数的求值顺序是未定义的。也就是说,在的声明中
std::cout << a+b+c << " " << (c=c*2) << " "<< (b =b*2);
根据首先计算的子表达式,会得到不同的结果。编译器可以选择从左到右对输出运算符的参数求值,但也可以按不同的顺序(例如从右到左)对其求值,然后执行适当的函数调用。
此代码的输出未定义。
在C++中,如果分配变量,则只允许在同一语句中使用以计算新值。任何其他用途都具有未定义的效果。(注意,您计算c是为了打印(第1个print子句),也是为了计算新的c(c=c*2)。
后一种用途是批准的,前一种则不是。
大多数编译器会将c的第一次使用计算为赋值前的值或赋值后的值,但事实上,他们甚至没有义务让它与任何相关的值进行求值。即使是相关的,也可能不是它在逻辑上保持的值,例如,如果赋值是(c=2*c+5),你也可以很容易地找到映射到c*=2,c+=5的值,并且第一个print子句可能会得到中间状态,而不是开始或结束状态。
b也存在同样的问题。编译器在处理这一问题时甚至不能被认为是一致的,因为它们的操作可能合理地取决于寄存器分配,而寄存器分配取决于本地代码。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- (C++)分析树以计算返回错误值的简单算术表达式
- C++:将控制台输出存储在宏中更好吗
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 如何修改Lambda表达式以将输出放入文本文件
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 如何预测此类一单元表达式的输出
- ReadProcessMemory输出中的C++正则表达式
- 用C++处理输出表达式
- 这个表达式 a = a + b - ( b = a );由于C++中的序列点而给出错误的输出
- 为什么来自 printf 的相同表达式的输出与 cout 不同
- 将符号替换为表达式中的值并打印表达式输出
- 输出任意c++表达式的类型
- C中简单表达式的奇怪输出,为什么?
- 将两个正则表达式结果连接到一个输出字段中,一次只能使用一个
- 为什么左折表达式不反转右折表达式的输出?
- 在不使用正则表达式之前和之后输出字符串向量'word'。制定相关程序