当前位置: 首页 > 知识库问答 >
问题:

如何检查c中的行为未定义?

闻人英韶
2023-03-14

我知道下面是未定义的,因为我试图在同一表达式中读写变量的值,即

int a=5;
a=a++;

但如果是这样,为什么下面的代码片段不是未定义的?

int a=5;
a=a+1;

因为在这里,我也试图修改a的值并同时写入它。

还请解释为什么标准没有纠正或删除这种未定义的行为,尽管他们知道这是未定义的?

共有3个答案

詹联
2023-03-14
匿名用户

长话短说,您可以在标准中找到每个定义的行为。所有没有被定义的东西都是未定义的。

对你的例子的直观解释:

a=a++;

您希望在一条语句中修改变量< code>a两次。

1) a= //first time
2) a++ //second time

如果你看这里:

a=a+1;

变量只能修改一次:

a= // (a+1) - doesn't change the value of a

为什么标准没有定义< code>a=a 行为?

其中一个可能的原因是:编译器可以执行优化。您在标准中定义的情况越多,编译器优化代码的自由度就越低。由于不同的架构可以有不同的递增指令实现,因此编译器不会使用所有处理器指令,以防它们会破坏标准行为。或者在某些情况下,编译器可以更改计算顺序,但是如果要修改某些内容两次,则此限制将强制编译器禁用此类优化。

左丘边浩
2023-03-14

为什么下面的代码段没有定义

int a=5;
a=a+1;  

该标准规定:

在上一个序列点和下一个序列点之间,对象应通过表达式的求值最多修改一次其存储值。此外,只能访问先前的值以确定要存储的值。

如果a=a 1a只修改一次,访问aa的前一个值只是为了确定要存储在中的值
a=a的情况下a被多次修改--由子表达式中的 operator修改,并由 a 修改。现在还没有定义哪个修改(通过 >)将首先发生。

几乎所有带有-Wall标志的现代编译器在编译第一个代码段时都会发出警告,如:

[Warning] operation on 'a' may be undefined [-Wsequence-point]

进一步阅读:如何理解像本节中这样的复杂表达式,并避免编写未定义的表达式?

陈朗
2023-03-14

它没有定义的原因不是你读和写,而是你写了两次。

a表示读取a并在读取后递增它,但我们不知道它是在=赋值之前发生(在这种情况下,=将用a的旧值覆盖)还是之后发生,在这种情况下a将递增。

就用< code > a;:)

a = a 1 没有问题,因为 a 只写一次。

 类似资料:
  • 问题内容: 测试JavaScript中是否未定义变量的最合适方法是什么?我已经看到了几种可能的方法: 要么 要么 问题答案: 如果您想知道变量是否已声明而无论其值如何,那么使用运算符是最安全的方法。考虑以下示例: 但这在某些情况下可能不是预期的结果,因为已声明但未初始化变量或属性。使用运算符进行更强大的检查。 如果您想知道变量是否尚未声明或具有值,请使用运算符,该运算符可确保返回字符串: 直接比较

  • 问题内容: 我想检查变量是否已定义。例如,以下引发未定义的错误 如何捕获此错误? 问题答案: 在JavaScript中,是一个对象。不存在的事物还有另一个价值,。DOM 在几乎所有无法在文档中找到某些结构的情况下都会返回,但是在JavaScript本身中是所使用的值。 第二,不,没有直接对等的内容。如果您确实要专门检查,请执行以下操作: 如果要检查变量是否存在,那只能用/ 来完成,因为它将未声明的

  • 本文向大家介绍如何在JavaScript中检查未定义的变量?,包括了如何在JavaScript中检查未定义的变量?的使用技巧和注意事项,需要的朋友参考一下 要检查变量是否为“未定义”,您需要使用以下命令进行检查。如果结果为“ false”,则表示未定义变量。在这里,变量结果为“ True”- 示例

  • 在本网站的最后一节中,他们提供了 作为由于函数参数中子表达式的未排序求值而导致的未定义行为的示例。但是,由于在计算所有函数参数和函数指示符之后,在实际函数调用之前,存在一个序列点,始终使用 调用 f,并且分配。有没有可能不发生这种情况?

  • 问题内容: 在ejs模板中检查未定义属性的最佳方法是什么? (我正在使用TJ Holowaychuk 的node.js包) 例: 我希望这会导致“ foo undefined”。它确实会引发 foo undefined 错误。 我知道这不应该成为问题,因为这是测试中的预期行为。有避免这种情况的简便方法吗? 我发现的唯一解决方案是使用该方法。 这不会引发任何错误。 有没有更好的方法来保持模板清洁?还

  • 本文向大家介绍C++未定义行为(undefined behavior),包括了C++未定义行为(undefined behavior)的使用技巧和注意事项,需要的朋友参考一下 衡量一个人是否真正活着的根本方法,就是看他是否有意愿、有能力做出主动的选择。 在计算机程序设计中,未定义行为(undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言