提问人:Nocrossie 提问时间:6/7/2023 最后编辑:Nocrossie 更新时间:6/7/2023 访问量:108
逻辑错误根据谁 逻辑错误 [关闭]
logic error according to whom logic error [closed]
问:
我一直在思考这个问题,这个问题出现在考试中,正确答案并不让我满意。当在 if 块的条件中定义 a=5 时,这可能是一个逻辑错误,但我可能希望返回 true 并执行赋值。无论在这么简单的代码中这样做是多么荒谬,难道不是只有程序员知道这是否是逻辑错误吗?我在这里的主要问题是,您认为下面的代码中有哪些错误类型?
if(a=5) int a=b+1;
a) 由于语法错误导致的逻辑错误 b) 仅语法错误 c) 由于逻辑错误导致的语法错误 d) 仅逻辑错误 e) 语法和逻辑错误
我不认为这段代码中的错误会相互触发,所以我做了 b。可能是e.但我真的很困惑
答:
给定此代码,假设 并且之前使用算术类型声明:a
b
if(a=5) int a=b+1;
存在语法错误,因为 的条件后面必须跟一个语句。上面后面跟着一个声明,因此它无法编译。if
由于代码包含语法错误,因此讨论代码是否存在逻辑错误是没有意义的,因为需要先修复代码以解决语法错误。
如果更改代码以将声明替换为赋值(即语句):
if(a=5) a=b+1;
这将首先在条件中分配值 5 to,使条件为 true,然后分配值 to 。这可能是一个逻辑错误,其目的是将 的值与 5 进行比较,即它应该是:a
b+1
a
a
a==5
if(a==5) a=b+1;
相反,如果将代码更改为在声明两边加上大括号,使其成为块语句的一部分:
if(a=5) { int a=b+1; }
我们再次面临可能的问题,即在条件中被分配而不是比较。此外,在 的主体中,将创建一个新变量并为其赋值 。当退出 block 语句时,该变量超出范围。最有可能的是,上层作用域的变量应该被更新:a
if
a
b+1
a
if(a==5) { a=b+1; }
假设 和 都在行前声明为整数,答案是存在两个逻辑错误。a
b
-
if(a=5)
这将分配给 。因此不需要 ,因为它将永远是 .
5
a
if
true
-
int a=b+1;
这将创建一个局部(阴影外部)并为其赋值。这直接超出了范围,使整个定义变得毫无意义。
a
a
a
此外,在 C 中,存在语法错误,因为 C 需要一个语句而不是声明。声明在 C++ 中很好,所以如果问题是关于 C++,则没有语法错误。int a=b+1;
评论
if(a=5)
if
int a=b+1;
if(a=5)
在语法上是正确的,但可能是错别字,大多数编译器会警告你。 不会编译为未声明(请参阅最小可重现示例)。如果是内置标量类型并且它被编译,那么它不起作用,因为新变量将被丢弃。如果是某个重载的类类型,那么谁知道会再次看到最小的可重现示例。这个问题需要一些先决条件才能完全理解。int a=b+1;
b
b
a
b
operator+