c - 使用 ”;” 在 for 语句的末尾,但代码仍在执行
问题描述
#include <stdio.h>
int main()
{
int sub[50], i;
for (i = 0; i <= 48; i++);
{
sub[i] = i;
printf("%d\n", sub[i]);
}
return 0;
}
为什么输出是49
?
我认为它不应该执行该printf
功能。
解决方案
你的程序有一个典型的错误:for
语句行以 a 结尾;
,导致for
有一个空的主体和下面的块无条件地执行一次,i
并且在循环结束时具有最终值,即49
。
语句在thefor
处结束,;
下一{
行的 the 开始一个单独的块,与语句无关for
,无条件执行。
所以你的程序相当于:
#include <stdio.h>
int main()
{
int sub[50], i;
for (i = 0; i <= 48; i++); // the compiler will simplify this to i = 49
sub[i] = i;
printf("%d\n", sub[i]);
return 0;
}
我不知道您是不是;
故意添加的,但如果您不小心添加了,请注意经典的 K&R 样式使此类错误的可能性大大降低:
#include <stdio.h>
int main() {
int sub[50], i;
//for (i = 0; i <= 48; i++); { // <--- this would immediately catch your eye!
for (i = 0; i <= 48; i++) {
sub[i] = i;
printf("%d\n", sub[i]);
}
return 0;
}
使用 c99 新for
语法,您将i
在for
初始子句中定义,编译器会发现错误:
#include <stdio.h>
int main()
{
int sub[50];
for (int i = 0; i <= 48; i++);
{
sub[i] = i; //<--- error: `i` is not defined anymore
printf("%d\n", sub[i]);
}
return 0;
}
;
故意在行尾仅尾随创建空循环for()
是令人困惑且容易出错的。如果配置为更高的警告级别,编译器可能会用警告标记这一点,顺便说一句,这是检测愚蠢错误的非常好的做法(即:gcc -Wall -Werror
或clang -Weverything -Werror
)。
如果你想要一个空的身体,我会推荐这种语法:
/* find the last node of the list */
if (list) {
for (cur = list; cur->next; cur = cur->next)
continue;
//...
}
推荐阅读
- r - 分析列表中的数据框并绑定结果
- python - 烧瓶 SQLAlchemy。AttributeError:模块 '<...>.db' 没有属性 'Model'
- javascript - 为什么幻灯片会跳过最后一张幻灯片?
- vb.net - 如何修复 vb.net 项目上未解决的引用异常
- elasticsearch - Logstash 实时读取 SQL Server 数据
- c# - 自定义 TypeDescriptor 和 AddValueChange/OnValueChanged
- html - 绝对链接和相对链接
- altair - Altair 挂在这张图表上?
- javascript - React:在映射渲染中处理 onChange
- performance - 压力测试 - API Gateway + AWS Lambda