【问题标题】:What is an expression of VLA type?VLA 类型的表达式是什么?
【发布时间】:2018-08-06 07:39:17
【问题描述】:

我试图了解 sizeof 运算符的工作原理,但遇到了this 题。以下是该问题的代码

#include <stdio.h>

int main() {
    int i = 0;
    int a[i];
    printf("%zu\n",sizeof(a[i++]));
    printf("%d\n",i); // Here, print 0 instead of 1
    return 0;
}

此处的数组 a 是可变长度的,但当它用作 sizeof 运算符的操作数时,变量 i 不会递增。

一些 cmets 和回答说 a[i++] 不是 VLA 类型,并建议 op 应该使用 2D VLA 来查看副作用(sizeof 评估其 oprand)。

我不明白为什么a[i++] 不符合 VLA 表达式的条件。我认为这与我们可以在传递给函数时不指定数组的第一个维度这一事实有关。

所以问题是一般来说什么是 VLA 表达式?

【问题讨论】:

    标签: c sizeof variable-length-array


    【解决方案1】:

    我不太明白为什么a[i++] 不符合 VLA 表达式的条件

    a[n] 不是 VLA 表达式,即使 a 是 VLA,因为表达式生成 VLA 的单个元素,而不是 VLA 本身。

    一般来说什么是 VLA 表达式?

    在您的示例中,a 将是一个 VLA 表达式,因为它表示一个可变长度数组。

    2D VLA 将为您提供sizeof 将评估其操作数的场景:

    int x, y;
    scanf("%d %d", &x, &y);
    int a[x][y];
    int i = 0;
    size_t z = sizeof(a[i++]);
    printf("%d %d\n", i, (int)z);
    

    这会打印出1,因为现在不仅a 是一个VLA,而且a[n] 也是一个VLA (demo)。

    【讨论】:

    • @coderredoc 你是对的,看起来 OP 想要一个场景来演示sizeof 评估其操作数的情况。非常感谢!
    • 你知道为什么标准要求对操作数进行评估吗?
    • @tstanisl 我最好的猜测是它是一致性所必需的。他们本可以说“可能被评估”而不是“被评估”以允许实现在可能的情况下使用启发式算法,但这会使程序员更难使用该语言(并不是说标准编写者一开始就特别适应程序员,但这不是重点)。
    • 如果他们的目的是让语言更简单,那么他们就失败了。他们实际上让语言变得更复杂,他们让 VLA 更难使用,他们将 UB 引入了常见的习语,比如sizeof *x。他们甚至没有解决混淆,因为“大小表达式”只是影响类型的表达式的一部分,仍然可能会或可能不会被评估。见 6.7.6.2p5 的最后一句话。对于 VLA 和非 VLA,这指的是 sizeof!非 VLA sizeof 仍然可能有副作用!
    • @tstanisl 我同意,添加 VLA 造成的混乱多于其价值。这可能就是为什么VLAs never made it to the C++ standard
    猜你喜欢
    • 1970-01-01
    • 2015-07-22
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多