有人能解释一下这段代码:
int a[]={1,2,3},b[]={6,7,8},c;
c=sizeof(!a+b);
cout<<c;
我得到了输出:8。但我不明白为什么。
答案 0 :(得分:8)
a
和b
在此上下文衰减指针类型。
因此表达式!a+b
是int*
类型。 我们需要在此处详细介绍:!a
实际上是bool
类型,添加到int*
类型的是int*
} type(在bool
到int
的隐式转换之后想想指针算术。)
sizeof(int*)
在您的平台上为8。
注意:sizeof
始终在编译时在C ++中进行评估。
答案 1 :(得分:8)
您必须阅读sizeof(!a+b);
,从最里面到最外层的表达。
a
衰败到int*
。b
衰败到int*
!a
的类型为bool
,因为应用了逻辑NOT运算符
a
。!a+b
的类型为bool + int* --> int + int* --> int*
所以你基本上这样做:
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]
,其值为int
(0
}或false
(1
})。
要记住的第三件事是关于指针算术,可以将整数添加到(或从中减去)。
要记住的第四件事是关于operator precedence。表达式true
等于!a + b
。
最后要记住的是添加commutative。即(!a) + b
与x + y
相同。
将所有这些放在一起,y + x
衰减到指向其第一个元素的指针。然后该指针被传递给逻辑非运算符a
,它将表达式!
转换为!a
bool
值(因为false
的衰减指针不是空指针)。然后将a
转换为整数false
,将其添加到0
的衰减指针中。结果是一个指针,指向b
(b
)的第一个元素。
然后将此指针传递给b + 0
,并且您显然位于64位系统上,其中指针的大小为64位,即8个字节。