【问题标题】:assignment inside sizeof function in c [duplicate]c中sizeof函数内部的赋值[重复]
【发布时间】:2023-04-11 04:21:01
【问题描述】:
foo(a = b+c);
//new value of a(after the call) = b+c
//but
sizeof(a = b+c);
//new value of a = old value of a

为什么在后一种情况下赋值语句的结果没有反映在函数(包含上述代码)的堆栈中?

【问题讨论】:

标签: c sizeof


【解决方案1】:

sizeof 是运算符而不是函数。 sizeof 的操作数不会被计算,除非它是一个可变长度数组。

C11:6.5.3.4 p(2):

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。 如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数,结果为整数常量

【讨论】:

    【解决方案2】:

    sizeof 不计算其操作数。

      size_t x = sizeof(i++);        // i is not incremented
    

    涉及变长数组时除外:

    (C99, 6.5.3.4p2) "如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果为整数常量。"

      size_t y = sizeof(int [j++]);  // j is incremented;
    

    (C99, 6.7.5.2p4) "如果大小表达式是 sizeof 运算符的操作数的一部分,并且更改大小表达式的值不会影响运算符的结果,则未指定大小是否表达式被计算。”

     size_t z = sizeof (*(int (*)[k++]) 0);  // k may or may not be incremented
                                             // gcc increments k
    

    【讨论】:

    • 如果表达式是++k,是否必须增加k?顺便说一句.. 这个表达式是否由于 NULL 取消引用而调用 UB?
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多