这是执行任务的其他答案中唯一正确的代码。:)
实际上,您需要一个程序来向后搜索满足给定条件的数组元素。如果有这样的元素,那么输出它。
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int a[] = { 5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
int *first = a, *last = a + N;
while ( first != last && ( unsigned int )abs( *( last - 1 ) ) < 5 ) --last;
if ( first != last ) printf( "%d\n", *--last );
return 0;
}
输出是
6
下面展示了此类任务的一般方法
#include <stdio.h>
#include <stdlib.h>
int * find_backward( const int a[], size_t n, int ( *predicate )( int ) )
{
const int *first = a, *last = a + n;
while ( first != last && !predicate( *( last -1 ) ) ) --last;
return ( int * )last;
}
int is_greater_or_equal_to_5( int x )
{
return 5 <= ( unsigned int )abs( x );
}
int main( void )
{
int a[] = { 5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
int *target = find_backward( a, N, is_greater_or_equal_to_5 );
if ( target != a ) printf( "%d\n", *--target );
return 0;
}
使用这种方法,您可以使用任何整数数组(即使大小为零)和通过谓词设置的任何条件。
例如,如果您想找到可被 3 整除的数组的最后一个元素,您可以编写
#include <stdio.h>
#include <stdlib.h>
int * find_backward( const int a[], size_t n, int ( *predicate )( int ) )
{
const int *first = a, *last = a + n;
while ( first != last && !predicate( *( last -1 ) ) ) --last;
return ( int * )last;
}
int divisible_by_3( int x )
{
return x % 3 == 0;
}
int main( void )
{
int a[] = { 5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
int *target = find_backward( a, N, divisible_by_3 );
if ( target != a ) printf( "%d\n", *--target );
return 0;
}
输出是
3
考虑到这个函数还允许处理常量数组。:)