如何仅使用按位运算符实现sizeof函数?这个问题在采访中问我。我试图解决它,但它只适用于unsigned int。在这里我也附上了代码。
unsigned int a = 1;
int b = 0;
while(a != 0){
a = a << 1;
b++;
}
b = b/8;
printf("%d",b);
注意:不允许使用指针。
答案 0 :(得分:2)
正如我之前所写,sizeof
不是一个功能;它是一个运算符,是一种特殊类型的运算符,其参数未被评估其值,因此sizeof *(char *)NULL
完全有效并且不会导致段错误的原因。这应该在采访中指出。
此外,这个问题是浪费时间,也是应该向采访者指出的事实。那时我会走出门,走向更明智的采访。如果他们经常追逐这种毫无意义的练习,你可能不想为这家公司工作。
话虽如此,受此欢迎的人可能会得出offsetof
宏可能有用的结论。形成包含给定类型的struct
和虚拟元素,然后使用offsetof
确定虚拟元素的偏移量。
#include <stddef.h>
#include <stdio.h>
#define my_sizeof(x) ((size_t) offsetof(struct { x fu; char ba; }, ba))
int main(void) {
printf("my_sizeof (char): %zu\n", my_sizeof(char));
printf("my_sizeof (void *): %zu\n", my_sizeof(void *));
}
请注意,在幕后,offsetof
宏可能会使用指针。我看到的唯一选择是使用&
地址运算符(例如this question),不要与按位&
运算符混淆(我认为您和/或您的采访者是做,也有待指出);这违反了您的要求,因为肯定使用指针。
然后,如果你根本不能使用指针,那么你排除了数组和函数调用;根据这一要求,整个语言几乎毫无用处。