C++ 我能知道变量是否已经改变了它的值,而没有将它与函数调用C中的前一个值进行比较吗?

C++ 我能知道变量是否已经改变了它的值,而没有将它与函数调用C中的前一个值进行比较吗?,c++,c,C++,C,对于下面的C/C++代码 void fun(int* x) { //SOMECODE;//WITHOUT SAVING PREVIOUS VALUE if(SOME CONDITION) printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n"); } int main() { int a; a=9; fun(&a); a=12; fun(&a); ret

对于下面的C/C++代码

void fun(int* x)
{
    //SOMECODE;//WITHOUT SAVING PREVIOUS VALUE
    if(SOME CONDITION)
    printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");
}

int main()
{
    int a;
    a=9;
    fun(&a);
    a=12;
    fun(&a);
    return 0;
}
是否有函数或标志值提供变量是否更改的信息
因此,如果有任何解决方案,请回答

再次阅读您的问题,您不是在检查变量是否更改,而是检查同一词汇标识符的两个不同实例是否不同

除非通过明确的比较,否则这是不可能的


关于检测变量变化的原始答案:

便携式、标准C或C+++< /P> 但是,有一些特定于环境的方法可以检测变量何时更改。您可以使用MMU访问控制标志(通过

mprotect
VirtualProtect
)在第一次写入时生成异常,并从处理程序内部设置脏标志。(几乎所有现代操作系统都使用内存映射文件来完成这项工作,以确定是否需要将其写回磁盘)。或者,您可以使用硬件断点来匹配对该地址的写入(调试器使用该断点在变量上实现断点)


与旧价值相比,所有这些都没有那么有效。(但与旧值相比将错过ABA场景)

无法检查当前值是否与上次调用时发送的值不同

在运行时,对
fun()
的每次调用都会创建一个独立的堆栈框架,其中包含自己的
x
副本
fun()
无法在此堆栈框架内保存任何值(用于存储局部变量),以供以后调用


在函数的“最后一次”调用过程中,如果不提供一些额外的代码来存储参数,则无法确定“变量是否已更改其值,而无需将其与以前的值进行比较”。

在“最后一次”调用过程中,根本无法检测是否使用相同的值调用它

由于x的“当前”值将存在于堆栈中,因此一旦函数调用完成,它将完全丢失

预多线程时代中,在上次运行函数
func
期间,仅使用静态变量缓存x的值就可以(几乎)解决您的问题:

void fun (int x) {
    static int old_value = VALUE_INVALID;

    if(x != old_value)
       printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");

    old_value = x;
}
这种方法仍然存在的唯一问题是重入性——这意味着如果在信号处理程序中调用
func
,缓存的值可能会出错

如果在多线程应用程序中运行,那么在使用这种方法时,还必须提供某种锁定机制,否则迟早会搞砸的

在这种情况下,您可能会陷入困境,因为您必须澄清“最后一次”调用函数和“执行期间”值的确切含义


当前右值是在线程B之前输入func但仍在执行的线程A的右值,还是在线程B之后输入但已完成func执行的线程B的右值

检查变量是否更改的目的是什么


使用包含变量和标志的结构怎么样。变量更改时,设置标志并将结构传递给函数。现在测试函数中的标志以检查变量是否已更改

只是创建一个<代码>静态< /代码>变量,这是一个很大的麻烦?这是一个C问题还是一个C++问题?另外,如果该值被更改,然后又更改回原始值,那么该值是否已更改?不,您所问的不受支持是的,这是可能的。但是
fun()
通过值传递
x
,而不是通过引用,因此(在本例中)无法检查此问题。对不起,我想我误解了这个问题。写得很糟糕。因为他说的是两个不同的实例,而不是对一个变量(单个实例)的更改,你是对的。假设我通过引用传递值,那么它是如何可能的假设我通过引用传递值,那么它是如何可能的@flyingOwl@user2182934例如我不知道。本·沃格特在回答中给出了一些提示。尽管如此,如果您获得引用/指针,仍然会很困难。使用静态变量(即使您必须比较它们)会容易得多。