C从两个数组中获取中间索引,变量初始化和三元运算符
C get middle index from two arrays , variable initialization and ternary opperators
我在 中遇到了这个 C 问题,我尝试从两个数组中获取中间索引
而且我不想手动分配中间索引变量。
我想写一个算法,所以如果数组有偶数个元素或没有中间索引自动选择
#include <stdio.h>
int middle(int array1[], int array2[], int array_s1, int array_s2)
{
int middle_index1, middle_index2;
array_s1 % 2 == 0 ? middle_index1 = array_s1 / 2 : (array_s1 / 2) - 1;
array_s2 % 2 == 0 ? middle_index2 = array_s2 / 2 : (array_s2 / 2) - 1;
printf("Elements in the original arrays:\n");
for (int i = 0 ; i < array_s1 ; i ++)
{
printf("%i, ", array1[i]);
}
printf("\n");
for (int i = 0 ; i < array_s2 ; i ++)
{
printf("%i, ", array2[i]);
}
printf("\nMiddle indexes = %i , %i", middle_index1, middle_index2);
int new_array[] = {array1[middle_index1], array2[middle_index2]};
int array_s3 = sizeof(new_array) / sizeof(new_array[0]);
printf("\nElements in the new array:\n");
for (int i = 0 ; i < array_s3 ; i++)
{
printf("%i, ", new_array[i]);
}
}
int main(void)
{
int array1[] = {10, 20, -30, -40, 30};
int array2[] = {120, 20 , 30, 40, 30};
int array_s1 = sizeof(array1) / sizeof(array1[0]);
int array_s2 = sizeof(array2) / sizeof(array2[0]);
middle(array1, array2, array_s1, array_s2);
}
但是这两行被评估为 0
array_s1 % 2 == 0 ? middle_index1 = array_s1 / 2 : (array_s1 / 2) - 1;
array_s2 % 2 == 0 ? middle_index2 = array_s2 / 2 : (array_s2 / 2) - 1;
为什么我做错了?
可以在变量初始化中使用三元运算符吗?
代码输出:
Elements in the original arrays:
10, 20, -30, -40, 30,
120, 20, 30, 40, 30,
Middle indexes = 0 , 0
Elements in the new array:
10, 120,
赋值必须在表达式的开头:
middle_index1 = array_s1 % 2 == 0 ? array_s1 / 2 : (array_s1 / 2) - 1;
middle_index2 = array_s2 % 2 == 0 ? array_s2 / 2 : (array_s2 / 2) - 1;
上面写着,if array_s1 % 2 == 0
then assign array_s1 / 2
to middle_index1
else assign (array_s1 / 2) - 1
.
至于表达式本身,它们最终基本上等于相同的值,在所有整数除法中,小数部分被截断,而不是像人们预期的那样四舍五入。
这些带有条件运算符的语句
array_s1 % 2 == 0 ? middle_index1 = array_s1 / 2 : (array_s1 / 2) - 1;
array_s2 % 2 == 0 ? middle_index2 = array_s2 / 2 : (array_s2 / 2) - 1;
可以等价改写成
( array_s1 % 2 == 0 ) ? ( middle_index1 = array_s1 / 2 ) : ( (array_s1 / 2) - 1 );
( array_s2 % 2 == 0 ) ? ( middle_index2 = array_s2 / 2 ) : ( (array_s2 / 2) - 1 );
因此,如果表达式 ( array_s1 % 2 == 0 )
和 ( array_s2 % 2 == 0 )
的计算结果为逻辑假,则这些语句不会产生任何效果。您需要的是以下内容
middle_index1 = array_s1 % 2 == 0 ? array_s1 / 2 : (array_s1 / 2) - 1;
middle_index2 = array_s2 % 2 == 0 ? array_s2 / 2 : (array_s2 / 2) - 1;
注意只写
逻辑更清晰
middle_index1 = array_s1 / 2;
middle_index2 = array_s2 / 2;
即数组元素个数为奇数时减1没有多大意义
例如,如果数组仅包含 2 个元素,则中间索引将等于 1。另一方面,如果数组包含 3 个元素,则中间索引将再次等于 1 而不是 0,如你的情况。
我在 中遇到了这个 C 问题,我尝试从两个数组中获取中间索引 而且我不想手动分配中间索引变量。 我想写一个算法,所以如果数组有偶数个元素或没有中间索引自动选择
#include <stdio.h>
int middle(int array1[], int array2[], int array_s1, int array_s2)
{
int middle_index1, middle_index2;
array_s1 % 2 == 0 ? middle_index1 = array_s1 / 2 : (array_s1 / 2) - 1;
array_s2 % 2 == 0 ? middle_index2 = array_s2 / 2 : (array_s2 / 2) - 1;
printf("Elements in the original arrays:\n");
for (int i = 0 ; i < array_s1 ; i ++)
{
printf("%i, ", array1[i]);
}
printf("\n");
for (int i = 0 ; i < array_s2 ; i ++)
{
printf("%i, ", array2[i]);
}
printf("\nMiddle indexes = %i , %i", middle_index1, middle_index2);
int new_array[] = {array1[middle_index1], array2[middle_index2]};
int array_s3 = sizeof(new_array) / sizeof(new_array[0]);
printf("\nElements in the new array:\n");
for (int i = 0 ; i < array_s3 ; i++)
{
printf("%i, ", new_array[i]);
}
}
int main(void)
{
int array1[] = {10, 20, -30, -40, 30};
int array2[] = {120, 20 , 30, 40, 30};
int array_s1 = sizeof(array1) / sizeof(array1[0]);
int array_s2 = sizeof(array2) / sizeof(array2[0]);
middle(array1, array2, array_s1, array_s2);
}
但是这两行被评估为 0
array_s1 % 2 == 0 ? middle_index1 = array_s1 / 2 : (array_s1 / 2) - 1;
array_s2 % 2 == 0 ? middle_index2 = array_s2 / 2 : (array_s2 / 2) - 1;
为什么我做错了? 可以在变量初始化中使用三元运算符吗?
代码输出:
Elements in the original arrays:
10, 20, -30, -40, 30,
120, 20, 30, 40, 30,
Middle indexes = 0 , 0
Elements in the new array:
10, 120,
赋值必须在表达式的开头:
middle_index1 = array_s1 % 2 == 0 ? array_s1 / 2 : (array_s1 / 2) - 1;
middle_index2 = array_s2 % 2 == 0 ? array_s2 / 2 : (array_s2 / 2) - 1;
上面写着,if array_s1 % 2 == 0
then assign array_s1 / 2
to middle_index1
else assign (array_s1 / 2) - 1
.
至于表达式本身,它们最终基本上等于相同的值,在所有整数除法中,小数部分被截断,而不是像人们预期的那样四舍五入。
这些带有条件运算符的语句
array_s1 % 2 == 0 ? middle_index1 = array_s1 / 2 : (array_s1 / 2) - 1;
array_s2 % 2 == 0 ? middle_index2 = array_s2 / 2 : (array_s2 / 2) - 1;
可以等价改写成
( array_s1 % 2 == 0 ) ? ( middle_index1 = array_s1 / 2 ) : ( (array_s1 / 2) - 1 );
( array_s2 % 2 == 0 ) ? ( middle_index2 = array_s2 / 2 ) : ( (array_s2 / 2) - 1 );
因此,如果表达式 ( array_s1 % 2 == 0 )
和 ( array_s2 % 2 == 0 )
的计算结果为逻辑假,则这些语句不会产生任何效果。您需要的是以下内容
middle_index1 = array_s1 % 2 == 0 ? array_s1 / 2 : (array_s1 / 2) - 1;
middle_index2 = array_s2 % 2 == 0 ? array_s2 / 2 : (array_s2 / 2) - 1;
注意只写
逻辑更清晰middle_index1 = array_s1 / 2;
middle_index2 = array_s2 / 2;
即数组元素个数为奇数时减1没有多大意义
例如,如果数组仅包含 2 个元素,则中间索引将等于 1。另一方面,如果数组包含 3 个元素,则中间索引将再次等于 1 而不是 0,如你的情况。