sizeof()表达式

时间:2017-10-12 11:44:58

标签: c++ arrays pointers sizeof

有人能解释一下这段代码:

int a[]={1,2,3},b[]={6,7,8},c;

c=sizeof(!a+b);

cout<<c;

我得到了输出:8。但我不明白为什么。

4 个答案:

答案 0 :(得分:8)

ab在此上下文衰减指针类型。

因此表达式!a+bint*类型。 我们需要在此处详细介绍!a实际上是bool类型,添加到int*类型的是int* } type(在boolint的隐式转换之后想想指针算术。)

sizeof(int*)在您的平台上为8。

注意:sizeof 始终在编译时在C ++中进行评估。

答案 1 :(得分:8)

您必须阅读sizeof(!a+b);,从最里面到最外层的表达。

  1. a衰败到int*
  2. b衰败到int*
  3. !a的类型为bool,因为应用了逻辑NOT运算符 a
  4. !a+b的类型为bool + int* --> int + int* --> int*
  5. 所以你基本上这样做:

    sizeof(int*)
    

    这是指针的大小,在你的系统中等于8。

答案 2 :(得分:3)

不评估作为sizeof运算符的操作数的表达式,它根据其操作数的类型确定大小。表达式!a+b的类型为int *(在数组到指针转换之后),而sizeof(!a+b)在您的平台上的大小为int *
请注意,虽然作为sizeof的操作数的数组不会衰减指向它的第一个元素,但是在表达式!a+b(指针算术)中它们将会衰减。

答案 3 :(得分:3)

[我添加了另一个答案,放弃了我现在删除的答案所得到的赞成票。]

这里发生了一些事情。

第一个是数组自然衰减到指针。当一个数组按原样传递时,当一个指针被指望时,它将等于一个指向数组第一个元素的指针。换句话说,表达式import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class Test{ public static void main(String[] args) { JSONParser parser = new JSONParser(); try { Object obj = parser.parse(new FileReader( "File location")); JSONObject jsonObject = (JSONObject) obj; JSONObject properties = (JSONObject) jsonObject.get("properties"); JSONObject triggerTime = (JSONObject) properties.get("triggerTime"); String ref = (String) triggerTime.get("$ref");//You can load this file to a map if required. System.out.println(ref); } catch (Exception e) { e.printStackTrace(); } } } 则等于a

要记住的第二件事是布尔值可以隐式转换为&a[0],其值为int0}或false1 })。

要记住的第三件事是关于指针算术,可以将整数添加到(或从中减去)。

要记住的第四件事是关于operator precedence。表达式true等于!a + b

最后要记住的是添加commutative。即(!a) + bx + y相同。

将所有这些放在一起,y + x衰减到指向其第一个元素的指针。然后该指针被传递给逻辑非运算符a,它将表达式!转换为!a bool值(因为false的衰减指针不是空指针)。然后将a转换为整数false,将其添加到0的衰减指针中。结果是一个指针,指向bb)的第一个元素。

然后将此指针传递给b + 0,并且您显然位于64位系统上,其中指针的大小为64位,即8个字节。