是否考虑无限循环;运行时错误;?(c)
我有一个问题:是否考虑无限循环;运行时错误;?(c),c,C,我有一个问题: #包括 int main() { 浮子; 对于(s=100000000001.0f;s我假设您使用的版本早于C11,因为大学通常教授较旧的版本。如果不是,请查看M.M的答案 无论如何,我们可以看看所有答案: 不编译:这是错误的。此程序可完美编译。但它可能会发出警告,这与错误不同 导致运行时错误:否。此代码只会继续运行。它将在for循环中永久保留(或只是关闭程序,不要太夸张)。第3点也是如此 打印SLABC:否。它位于for循环的内。阅读第2点了解更多信息 不打印任何内容:这是
#包括
int main()
{
浮子;
对于(s=100000000001.0f;s我假设您使用的版本早于C11,因为大学通常教授较旧的版本。如果不是,请查看M.M的答案
无论如何,我们可以看看所有答案:
不编译:这是错误的。此程序可完美编译。但它可能会发出警告,这与错误不同
导致运行时错误:否。此代码只会继续运行。它将在for
循环中永久保留(或只是关闭程序,不要太夸张)。第3点也是如此
打印SLABC:否。它位于for
循环的内。阅读第2点了解更多信息
不打印任何内容:这是正确答案。没有错误,程序将执行所有内容
你的程序本质上就像我的列表。如果你正确地遵循它,你将被卡在第2点和第3点之间,永远无法阅读第4点。但你比这更聪明。我假设你使用的版本早于C11,因为大学通常教授较旧的版本。如果没有,请查看M.M的答案
无论如何,我们可以看看所有答案:
不编译:这是错误的。此程序可完美编译。但它可能会发出警告,这与错误不同
导致运行时错误:否。此代码只会继续运行。它将在for
循环中永久保留(或只是关闭程序,不要太夸张)。第3点也是如此
打印SLABC:否。它位于for
循环的内。阅读第2点了解更多信息
不打印任何内容:这是正确答案。没有错误,程序将执行所有内容
你的程序本质上就像我的列表。如果你正确地遵循它,你将被卡在第2点和第3点之间,永远无法读取第4点。但是你比这更聪明。因为线程被添加到了C(即C11标准),有一个向前的进度保证。每个循环都必须执行某些操作或退出,并且对于“有意”无限循环(如while(1)
)有一个例外
C116.8.5/6中的文本:
一种迭代语句,其控制表达式不是常量表达式,不执行输入/输出操作,不访问易失性对象,并且在其主体、控制表达式或(在for
语句的情况下)中不执行同步或原子操作其表达式-3可由实现假定为
终止
您的程序属于这种情况,因为循环条件不是一个常量表达式,因为它涉及一个变量s
因此,程序可能表现为循环终止,即它可能继续打印SLABC
并退出。或者(当然取决于您的实现中float
的属性),它可能永远留在循环中,而不输出任何内容
本条款的目的是允许优化器删除空循环,而无需证明循环最终会结束。或者换句话说,除非while(1)
或类似命令故意发出永久挂起的信号
注:可以认为,试图执行这样一个循环意味着行为未定义,因为标准没有说明循环以这种方式终止意味着什么(例如,循环后哪些值可能保持?s
)。如果接受此参数,则可能出现任何其他结果,包括编译错误
clang(trunk)似乎将其视为未定义的行为,当执行到达循环时中止程序。gcc-10.2的godbolt实现在经过一定时间后也会导致运行时错误(这不是不一致的,因为循环可能会终止)。因为线程被添加到C(即C11标准),有一个向前的进度保证。每个循环必须做某事或退出,并且对于“有意”无限循环(如while(1)
)有一个例外
C116.8.5/6中的文本:
一种迭代语句,其控制表达式不是常量表达式,不执行输入/输出操作,不访问易失性对象,并且在其主体、控制表达式或(在for
语句的情况下)中不执行同步或原子操作其表达式-3可由实现假定为
终止
您的程序属于这种情况,因为循环条件不是一个常量表达式,因为它涉及一个变量s
因此,程序可能表现为循环终止,即它可能继续打印SLABC
并退出。或者(当然取决于您的实现中float
的属性),它可能永远留在循环中,而不输出任何内容
本条款的目的是允许优化器删除空循环,而无需证明循环最终会结束。或者换句话说,除非while(1)
或类似命令故意发出永久挂起的信号
注:可以认为,试图执行这样一个循环意味着行为未定义,因为标准没有说明循环以这种方式终止意味着什么(例如,循环后哪些值可能保持?s
)。如果接受此参数,则可能出现任何其他结果,包括编译错误
clang(trunk)似乎将其视为未定义的行为,当执行到达循环时中止程序
#include <stdio.h>
int main()
{
float s;
for (s = 100000001.0f; s <= 100000010.0f; s += 1.0f) {
};
printf("SLABC\n");
return 0;
}
#include <stdio.h>
int main(){
for(int i = 0; i < 100000000; i++){
char a = 0;
printf("%d",i);
}
return 0;
}
...Program has been killed (because output is larger than 20 MB)
Prints Nothing