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,如你的情况。