是否考虑无限循环;运行时错误;?(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