例如,此代码段的结果取决于哪台机器:编译器机器或机器可执行文件有效?
sizeof(short int)
答案 0 :(得分:57)
sizeof
是编译时运算符。
答案 1 :(得分:11)
这取决于执行程序的机器。但是值在编译时进行评估。因此编译器(当然)必须知道它正在编译哪台机器。
答案 2 :(得分:6)
sizeof在编译时进行评估,但如果将可执行文件移动到编译时间和运行时值不同的机器上,则可执行文件将无效。
答案 3 :(得分:5)
从C99开始,当且仅当操作数是可变长度数组时,才在运行时评估sizeof,例如, int a [b],其中b在编译时是未知的。在这种情况下,sizeof(a)在运行时进行评估,其结果是整个数组的大小(以字节为单位),即组合中所有元素的大小。要获取数组中元素的数量,请使用Object.prototype.own = function () {
return new Proxy(this, {
has: function (target, propertyName) {
return target.hasOwnProperty(propertyName);
}
});
};
var intersection = function(obj1, obj2) {
var result = [];
for (var k in obj1.own()) if (k in obj2.own()) result.push(k);
return result;
};
document.writeln(intersection({ a: 1, b: 2, c: 3 }, { b: 2, c: 3, d: 4}));
。从C99标准:
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型确定。结果是整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是 整数常数。
请注意,所有这些都与您在堆上分配数组时所获得的不同,例如: sizeof(a) / sizeof(b)
。在这种情况下,sizeof(a)只会给你一个指向int的指针的大小,即4或8个字节,无论数组中有多少个元素。