为什么我的while循环即使在值为true时也会继续执行?

时间:2016-12-20 14:16:51

标签: c loops while-loop scope cs50

我最初尝试使用Do While循环但是与while循环具有相同的结果。用户必须输入数字28-31。在第一次尝试时,如果用户正确输入值,它将转到代码的下一部分。但是,如果用户输入的值不正确,它会再次询问一个号码,但无论他们输入什么,都会不断重复。

return

printf语句用于调试目的,以测试if ($n > 1) { $p *= $n--; return fact($n, $p); // return the value } 是否重新分配值。

2 个答案:

答案 0 :(得分:13)

在第一个while中,您有:

 int daysInMonth = GetInt(); 

这为daysInMonth正文定义了一个 new 变量while,它隐藏了具有相同名称的外部变量。因此,在while循环的条件中,您使用外部daysInMonth,在正文中使用内部daysInMonth

我想您要从此行中删除int部分,只需修改外部daysInMonth

实际上,第二个while循环中的情况相同。

答案 1 :(得分:4)

TL:DR 您的代码中有两个个名为daysInMonth的变量,重叠范围,这会产生问题

pennies变量也存在同样的问题。

详细说明,

int daysInMonth = GetInt();

创建一个(另一个)变量,该变量是while循环体的本地变量。它会遮蔽外部daysInMonth变量,因此在条件检查中,值永远不会更改。改为

  daysInMonth = GetInt(); 

while循环体内。

引用c11,章节§6.2.1,标识符范围

  

[...]如果是声明符或类型说明符   声明标识符出现在块内或参数声明列表中   一个函数定义,标识符有块作用域,它终止于   相关块。 [...]

  

[...]如果标识符指定同名的两个不同实体   空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束   严格地在另一个实体的范围之前(外部范围)。 在内部范围内,   identifier指定在内部作用域中声明的实体;在外部宣布的实体   范围在内部范围内隐藏(并且不可见)。