我最初尝试使用Do While循环但是与while循环具有相同的结果。用户必须输入数字28-31。在第一次尝试时,如果用户正确输入值,它将转到代码的下一部分。但是,如果用户输入的值不正确,它会再次询问一个号码,但无论他们输入什么,都会不断重复。
return
printf语句用于调试目的,以测试if ($n > 1) {
$p *= $n--;
return fact($n, $p); // return the value
}
是否重新分配值。
答案 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指定在内部作用域中声明的实体;在外部宣布的实体 范围在内部范围内隐藏(并且不可见)。