【问题标题】:statement even working and executing fine without the semicolon没有分号的语句甚至可以正常工作和执行
【发布时间】:2016-07-06 16:40:42
【问题描述】:

所以我刚刚写了下面提到的程序:

 #include<stdio.h>
int main()
{
    int a, b = 120;
    a = -b--;
    printf("a = %d, b = %d", a, b);
    return 0;
}

输出是 a = -120, b = 119 ,这对我来说很好,但是当我稍微修改运行上述程序时,它会给出一些奇怪的结果。

    #include<stdio.h>
int main()
{
    int a, b = 120;
    a = b---      *// strange here , because program run without semicolon here.*
    printf("a = %d, b = %d", a, b);
    return 0;
}

我想知道为什么这个程序能够运行,即使我没有关闭语句,我也没有看到任何错误。

编辑:如果没有分号,那么对于编译器来说,它意味着相同的语句,直到它看到分号。

【问题讨论】:

    标签: c output


    【解决方案1】:

    您的第二个代码(删除由注释引起的语法错误后)为

    a = b-- - printf("a = %d, b = %d", a, b);
    

    由于printf 返回一个值,即有效代码。当我初始化时

    int a = 0;
    

    程序输出是

    a = 0, b = 120
    

    在 C 中,行尾并不意味着语句结束。

    【讨论】:

    • @CherubimAnand 如你所知 - 这就是我初始化 a 的原因。但是b 的用法是否未定义?问题问为什么程序会编译。
    • 是的,我明白它为什么会编译,但我认为行为已定义,请看一下:ideone.com/xXID9d这只是a的值我认为这是不确定的。
    • is the usage of b undefined? 我认为它在技术上是undetermined,因为C 在这种情况下不能保证评估顺序。所以输出可能是= 120= 119 但没有别的。
    • @CherubimAnand 抱歉,我的意思是b打印值。显然,a 的原始值在 OP 的代码中是未定义的,而在我的 sn-p 中,a 的最终值也可能是未定义的,特别是如果 int b=100printf 的返回值可能未定义时关于是否将b 打印为99100
    【解决方案2】:

    您的代码有效,因为printf() 返回一个 int(打印的字符数),所以您的操作是

    a = (b--) - (printf("a = %d, b = %d", a, b));
    

    【讨论】:

    • @2501 错误。代码有效(如果您在没有任何标志的情况下编译它),但行为未定义。
    • 代码可以编译,但如果您不想要未定义的行为,它就不会“工作”。
    • 未定义的行为 - b 在同一个语句中被使用和修改。
    • @2501 是的,我明白这一点,我同意我们不同意 :) 无论如何,问题是“为什么它运行以及为什么我没有看到任何错误”,好吧,解释是我的回答
    • 该代码两次出现 UB(未定义行为)。 a 在没有初始化的情况下使用,b 在没有中间序列点的情况下修改和使用。 UB 不保证会崩溃,但这并不意味着代码有效
    【解决方案3】:

    一元减号和一元减量没有相同的优先级。一元减量更高。如果一元负数较高,则不能应用减量,因为它的参数是表达式而不是左值,并且只能减量左值。

    我不知道“尚未结束声明”是什么意思。你是指以'}'结尾的函数定义吗?

    //这里很奇怪,因为程序在这里运行时没有分号。 ?首先,如果没有分号,它就不会编译,更不用说运行了。此外,您不使用 *// 开始逗号,因此也不会编译。它运行是因为没有这些错误的先前版本成功编译和链接并生成了 a.out;毫无疑问,您正在重新执行这个旧的 a.out。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      相关资源
      最近更新 更多