是否可以像在电子表格中那样动态地在C ++中计算值(对另一个变量的反应已被更改)?
例如:
int x;
y = 2 * x;
cin >> x;
cout << y;
我想这样做,以便我可以重复修改x
,cout << y
将显示重新计算的值,而不必关闭程序或endl并再次输入以输入不同的x值。 (见图)
答案 0 :(得分:1)
不能以这种方式进行编码。定义变量时,会从内存中提供空闲空间,但不能进行算术处理,因为没有进行值赋值。
答案 1 :(得分:-1)
您真的想在程序中嵌入interpreter。您可以嵌入Lua,Guile等等......
像Excel这样的spreadsheet是一种特殊的lazy事件驱动的函数式编程语言的解释器,具有很好的表驱动GUI。某些电子表格(例如Libreoffice或Gnumeric)为free software,因此您可以研究其源代码(并可能根据您的需要调整或扩展它)。通过一些努力(可能需要几个月),您可以编写一个简单的电子表格程序(Qt部分使用GUI)。 github上有许多免费软件电子表格程序。
否则,请自己编写口译员或评估员。定义您的语言及其语法(使用EBNF表示法)和semantics。 Parse将一些语法AST添加到JIT compilation中,将 environment 的一些概念映射到值,并对您的求值程序进行编码。给定环境和某个表达式的AST,您的求值程序将(递归地)计算给定环境中给定表达式的值。您甚至可以考虑使用一些GCCJIT库(如Dragon Book)来生成与每个表达式相关的机器代码。
阅读Programming Language Pragmatics,Lisp In Small Pieces,plugins将有助于设计然后实现这样的解释器(或简单的电子表格)。
也许您只需要接受this answer到您的软件。
另请参阅{{3}}相关问题。
不要忘记C ++变量只有编译器知道。在执行期间,它们只是内存位置。
答案 2 :(得分:-1)
是的,你可以。但你必须编程。 最简单的版本是使用lambda:
int main()
{
int y;
int x;
auto updateYfromX = [ & ]()
{
y = x * 2;
};
std::cin >> x;
updateYfromX();
std::cout << '\n' << x << ':' << y << '\n';
}
但问题是你必须记住每次x改变时调用更新函数;
那么现在呢? 现在你需要利用C ++的强大功能,创建一个自动对其值的变化作出反应的类。
这是一个类ReactOnChangeInt
。
它需要一个附加参数,一个函数,每次为其赋值时都会调用它。
#include <iostream>
#include <functional>
class ReactOnChangeInt
{
int value;
const std::function<void(const int)> onChangeAction;
public:
ReactOnChangeInt( const std::function<void(const int)> action )
: value{}
, onChangeAction( action )
{ }
ReactOnChangeInt(const int i, const std::function<void (const int)> action)
: value(i)
, onChangeAction( action )
{}
int operator= (const int i)
{
value = i;
onChangeAction(value);
return value;
}
operator int() const
{
return value;
}
friend std::ostream& operator << (std::ostream& out, ReactOnChangeInt m)
{
out << m.value;
return out;
}
friend std::istream& operator >> ( std::istream& in, ReactOnChangeInt& m )
{
int i;
in >> i;
m = i;
return in;
}
};
您可以这样使用:
int main()
{
int y;
ReactOnChangeInt x ( [ & ]( const int val )
{
y = val * 2;
} );
std::cin >> x;
std::cout << '\n' << x << ':' << y << '\n';
}
下一步是创建类的通用版本(使用模板),这样您就可以使用任何类型(不只是int
)。