c/c++语言开发共享VLA和操作数大小的副作用

我知道sizeof从不评估其操作数,除非在所述操作数是VLA的特定情况下。 或者,我以为我知道。

 void g(int n) { printf("g(%d)n", n); } int main(void) { int i = 12; char arr[i]; // VLA (void)sizeof *(g(1), &arr); // Prints "g(1)" (void)sizeof (g(2), arr); // Prints nothing return 0; } 

到底是怎么回事?

以防万一,这是在Coliru上用GCC 5.1编译的。

    在发布之前我似乎应该三思而后行,因为在我这样做之后它就让我感到震惊。

    我对sizeof如何与VLA交互的理解实际上是正确的,如下面的引用所证实的那样(感谢@this!):

    6.5.3.4 sizeof_Alignof运算符
    如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量

    这不是造成这种令人惊讶(对我而言)行为的原因。

     (void)sizeof (g(2), arr); 

    (g(2), arr)子表达式中,逗号运算符触发arr的数组到指针衰减。 因此, sizeof的操作数不再是VLA,而是普通的char* ,它回退到不评估其操作数。

    显然,这种行为在C ++中已被改变,其中逗号运算符将不再衰减数组。

    需要了解更多c/c++开发分享VLA和操作数大小的副作用,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享VLA和操作数大小的副作用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979925.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐