逻辑错误根据谁 逻辑错误 [关闭]

logic error according to whom logic error [closed]

提问人:Nocrossie 提问时间:6/7/2023 最后编辑:Nocrossie 更新时间:6/7/2023 访问量:108

问:


这个问题似乎与帮助中心定义的范围内的编程无关。

6个月前关闭。

我一直在思考这个问题,这个问题出现在考试中,正确答案并不让我满意。当在 if 块的条件中定义 a=5 时,这可能是一个逻辑错误,但我可能希望返回 true 并执行赋值。无论在这么简单的代码中这样做是多么荒谬,难道不是只有程序员知道这是否是逻辑错误吗?我在这里的主要问题是,您认为下面的代码中有哪些错误类型?

if(a=5) int a=b+1;

a) 由于语法错误导致的逻辑错误 b) 仅语法错误 c) 由于逻辑错误导致的语法错误 d) 仅逻辑错误 e) 语法和逻辑错误

我不认为这段代码中的错误会相互触发,所以我做了 b。可能是e.但我真的很困惑

C++ 语法错误

评论

2赞 NathanOliver 6/7/2023
整个事情都没用,所以我会两者兼而有之。 是一个语法错误,否则,如果您不想检查是否相等,请删除。 为 if 状态创建一个局部变量,并立即结束 if 语句,因此该变量毫无意义,因此逻辑错误。if(a=5)ifint a=b+1;
1赞 Richard Critten 6/7/2023
if(a=5)在语法上是正确的,但可能是错别字,大多数编译器会警告你。 不会编译为未声明(请参阅最小可重现示例)。如果是内置标量类型并且它被编译,那么它不起作用,因为新变量将被丢弃。如果是某个重载的类类型,那么谁知道会再次看到最小的可重现示例。这个问题需要一些先决条件才能完全理解。int a=b+1;bbaboperator+
2赞 Pepijn Kramer 6/7/2023
有点好笑,以我所有的经验..我什至不知道如何正确分类......除此之外,作为单行没有意义。
1赞 Eric Postpischil 6/7/2023
我投票关闭这个问题,因为它在回答 C 后被编辑以删除 C 标签。一开始这是一个低价值的问题,现在它和答案都变得混乱了。
1赞 Ted Lyngmo 6/10/2023
明白了。只要看看答案,看看变化对他们有什么影响。@dbush 的答案对 C 来说是正确的。我的答案看起来很垃圾,没有 C.“为什么要把 C 带进来”之类的。

答:

1赞 dbush 6/7/2023 #1

给定此代码,假设 并且之前使用算术类型声明:ab

if(a=5) int a=b+1;

存在语法错误,因为 的条件后面必须跟一个语句。上面后面跟着一个声明,因此它无法编译。if

由于代码包含语法错误,因此讨论代码是否存在逻辑错误是没有意义的,因为需要先修复代码以解决语法错误。

如果更改代码以将声明替换为赋值(即语句):

if(a=5) a=b+1;

这将首先在条件中分配值 5 to,使条件为 true,然后分配值 to 。这可能是一个逻辑错误,其目的是将 的值与 5 进行比较,即它应该是:ab+1aaa==5

if(a==5) a=b+1;

相反,如果将代码更改为在声明两边加上大括号,使其成为块语句的一部分:

if(a=5) { int a=b+1; }

我们再次面临可能的问题,即在条件中被分配而不是比较。此外,在 的主体中,将创建一个新变量并为其赋值 。当退出 block 语句时,该变量超出范围。最有可能的是,上层作用域的变量应该被更新:aifab+1a

if(a==5) { a=b+1; }
3赞 Ted Lyngmo 6/7/2023 #2

假设 和 都在行前声明为整数,答案是存在两个逻辑错误。ab

  1. if(a=5)
    

    这将分配给 。因此不需要 ,因为它将永远是 .5aiftrue

  2. int a=b+1;
    

    这将创建一个局部(阴影外部)并为其赋值。这直接超出了范围,使整个定义变得毫无意义。aaa

此外,在 C 中,存在语法错误,因为 C 需要一个语句而不是声明。声明在 C++ 中很好,所以如果问题是关于 C++,则没有语法错误。int a=b+1;