代码之家  ›  专栏  ›  技术社区  ›  Damn Vegetables

*pt+++=20有效吗?

c
  •  0
  • Damn Vegetables  · 技术社区  · 7 月前

    下面是一道考试题。 +++= 看起来很奇怪,所以我问了MS Copilot,它一直说它无效,谷歌Gemini说它可能有效,但它没有定义。是 *pt +++= 20; 有效,并保证与 *pt++ += 20;

    #include <stdio.h>
    void main()
    {
        int num[4] = {1, 2, 3, 4};
        int *pt = num;
        pt++;
        *pt++ = 5;
        *pt ++= 10;
        pt--;
        *pt +++= 20;
        printf("%d %d %d %d", num[0], num[1], num[2], num[3]);
    }
    

    考试的答案是“1 5 30 4”,当我在电脑上运行代码时就是这样。

    4 回复  |  直到 7 月前
        1
  •  4
  •   Lundin    7 月前

    这道看起来很糟糕的考试题实际上是有效的,而且定义明确。

    • *pt = num; 指向第一项,好的。
    • pt++; 指向第二项,好的。
    • *pt++ = 5; 取消引用第二个项目(并在那里写5),然后指向第三个项目,好的。
    • *pt ++= 10; 取消引用第三项(并在那里写10),然后指向第四项,好的。
    • pt--; 回到第三项。
    • *pt +++= 20; 取消对第三项的引用(在那里加20),然后指向第四项,好的。

    *pt++++=20; 具体是根据非正式地称为“最大孟奇规则”的东西来解析的( more info here ),这意味着C解析器将寻找形成有效令牌的最长序列,然后使用它。

    在这种情况下 ++ 是比更长的有效序列 + ,所以这总是会被当作 (*pt++) += 而不是作为 (*pt + ) ++= .

    运算符优先级:后缀 ++ 最高,超过一元 * 结束 += 复合分配。指针增量将自然地发生在表达式的末尾,就像这里的所有其他情况一样。现在,结果是 * 是一个所谓的“左值”,一个可修改的内存位置,所以我们可以使用 += 除此之外。

        2
  •  -3
  •   Uranus    7 月前

    pt++++=20=>( (pt++))+=20;

    这可以分为三个部分:

    pt++:增加指针pt以指向下一个内存位置。

    *pt:取消引用指针pt。

    += 20;: 将值加20。

        3
  •  -7
  •   Atul maurya    7 月前

    否,*pt++=20在C语言语法中无效。

    让我们打破它

    *pt正在取消引用指针pt。这意味着它正在尝试访问pt所指向的值。 +++在C中不是有效的运算符。在C中没有这样的运算符可以组合三个+符号。 因此,如果您试图编译*pt++=20,它将导致语法错误。