我想减少指向数组最后一个元素的指针,并检查指针的值是否小于5的条件,什么都不做,然后转到下一轮循环,如果不是,那就是if值等于或大于5,打印该值。因此,对于示例中的数组,我只想打印6,这是第一次遇到等于或大于5的值。我尝试了下面的代码,但在编译时没有错误,它不打印任何值。我很感激你对此的评论。
#include<stdio.h>
//The is a C program to decrement an array from the last element to the first.
int x[11] = {5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2};
int *lastElem, count;
int main (void) {
lastElem = &x[10];
for (count = 0; count < 11; count++)
if (abs(*lastElem) < 5)
continue;
else
printf("%d\n", *lastElem--);
return 0;
}
答案 0 :(得分:3)
您的减量逻辑存在问题。如果该值小于5,则您错过了该下降。
检查以下代码。
#include<stdio.h>
//The is a C programme to decrement an array from the last element to the first.
int x[11] = {5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2};
int *lastElem, count;
int main (void) {
lastElem = &x[10];
for (count = 0; count < 11; count++)
{
if (*lastElem >= 5)
{
printf("%d\n", *lastElem);
break ;
}
lastElem--;
}
return 0;
}
编辑:
当您修改问题以包含absolute value
比较时,更改如下所示。
注意:当进行一些重大更改[会改变行为和输出]到原始问题时,请记下这一点,如果可能的话,请正确提及编辑。 强>
#include<stdio.h>
#include <stdlib.h>
//The is a C programme to decrement an array from the last element to the first.
int x[11] = {5, -6, -4, -3, -2, -1, 4, 3, 2, 1, -2};
int *lastElem, count;
int main (void) {
lastElem = &x[10];
for (count = 0; count < 11; count++)
{
if ( abs(*lastElem) >= 5)
{
printf("%d\n", *lastElem);
break;
}
lastElem--;
}
return 0;
}
答案 1 :(得分:3)
您永远不会将另一个地址分配给lastElem
而不是初始值(即第10个元素)。此外,如果要向后移动,请将count
设置为10,并将其计数为0.在每个循环中,您必须将&x[count]
分配给lastElem
(或者减少它,因为它是指针和地址将根据它指向的对象递减。
答案 2 :(得分:1)
行printf("%d\n", *lastElem--);
并不总是执行,只会在abs(*lastElem) >= 5
时执行。这就是你应该怎么做的
#include<stdio.h>
//The is a C programme to decrement an array from the last element to the first.
int x[11] = {5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2};
int *lastElem, count, value;
int main (void)
{
lastElem = &x[10];
for (count = 0; count < 11; count++)
{
value = *(lastElem--);
if (value < 5)
continue;
printf("%d\n", value);
break;
}
return 0;
}
这将使用continue
。
答案 3 :(得分:1)
以下是执行此任务的其他答案中唯一正确的代码。:)
实际上,你需要一个程序向后搜索满足给定条件的数组。如果有这样的元素则输出它。
#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
考虑到这个函数也允许处理常量数组。:)