我正在学习如何求数组的长度,但我对这个解决方案感到困惑。我试图在网上找到一个解释,但似乎没有。
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;
数组的内存地址与第一个元素的内存地址相同,并且当您对指针进行加法或减法时,都是通过它所指向的类型的大小来完成的,因此:
arr
是指int
,&arr
是指int[5]
。&arr+1
以五个整数的大小递增内存地址。(&arr+1)-arr
,则会出现编译错误,因为它们是不同的类型。(&arr+1)-&arr
则得到1
,因为内存地址的偏移量与int[5]
的一个大小相同。*(&arr+1)
时,您将得到相同的内存地址,但指向的是int
而不是int[5]
。现在,您不会得到编译错误,因为这两个指针都指向int
,您得到的是以int
大小表示的内存地址偏移量,而不是int[5]
。内存地址和类型有时很难解释,我希望我说清楚了。这里有一些代码,您可以运行这些代码来查看所提到的一些概念: int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "arr: " << arr << endl;
cout << "arr + 1: " << arr+1 << endl;
cout << "&arr: " << &arr << endl;
cout << "&arr + 1: " << &arr+1 << endl;
cout << "*(&arr + 1): " << *(&arr+1) << endl;
// cout << "&arr + 1 - arr: " << &arr+1-arr << endl;
// error: invalid operands of types ‘int (*)[5]’ and ‘int [5]’ to binary ‘operator-’
cout << "The length of the array is: " << len;
问题内容: 如果我尝试这样做: 我得到以下输出: 演示:http://codepad.org/ncVuJtJu 这是为什么? 我希望将其作为输出: 我的理解: 但是为什么不输出呢? 问题答案: 所有解释为什么得到2而不是1的答案实际上都是错误的。根据PHP文档,混合并以这种方式是不确定的行为,所以你可以得到1或2切换到不同版本的PHP可能会改变你得到的结果,这将是一样有效。 请参阅示例1,其中显示
问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存
我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?
我总是假设当执行时,优化器自然会使用有效的按位操作,就像我写了
问题内容: 这是我必须弄清楚怎么可能的代码。我有一个线索,但我不知道该怎么做。我认为这与负数和正数有关,也可能与变量修饰符有关。我是一个初学者,我到处都看过解决方案,但是找不到可用的东西。 问题是:您需要声明和初始化两个变量。如果条件必须为真。 代码: 感谢您抽出宝贵的时间。 问题答案: 这对于基本类型是不可能的。您可以使用带框的整数来实现: 在和比较将使用未装箱的值1,而将比较引用,并会成功,因
问题内容: 我是一名新的Java学习者。最近,我在阅读泛型编程,并对此感到困惑。 问题答案: 首先,这些是在不同上下文中使用的完全不同的构造。 是通用类型声明的一部分,例如 它使用类型参数声明泛型类型,并引入界限,因此必须是的子类型。 是带通配符的参数化类型,可以作为普通类型用于变量和方法声明等中: 变量声明诸如装置类型的该被参数化与一些亚型。 例如,给出此声明 您可以: 将的某些子类型分配给: