保存和使用memchr';s返回值,以if为单位&引用;如果(ptr=memchr(str1,4,sizeof(str1))”;?

保存和使用memchr';s返回值,以if为单位&引用;如果(ptr=memchr(str1,4,sizeof(str1))”;?,c,C,问题:如果你这样做了 if ( ptr = memchr( str1, '4', sizeof(str1) ) ) { // do stuff using ptr } 然后你每次都会进入并做一些“事情”。 但如果你这么做的话 if ( memchr( str1, '4', sizeof(str1) ) ) { // would do stuff but don't have ptr! } 然后您将输入,但没有指向str1中“4”所在位置的指针。 我需要评估和做一些事情的几种可

问题:如果你这样做了

if ( ptr = memchr( str1, '4', sizeof(str1) ) )
{
    // do stuff using ptr
}
然后你每次都会进入并做一些“事情”。 但如果你这么做的话

if ( memchr( str1, '4', sizeof(str1) ) )
{
    // would do stuff but don't have ptr!
}
然后您将输入,但没有指向str1中“4”所在位置的指针。 我需要评估和做一些事情的几种可能性,如如果'4',如果'7',如果'1',等等

那么,最有效的方法是什么,既计算该字符是否存在,又使用返回的指针(如果存在)?当然不是

if ( memchr( str1, '4', sizeof(str1) ) )
{
    ptr = memchr( str1, '4', sizeof(str1) )
    // do stuff using ptr
}

执行memchr并分配返回值,然后执行if。像这样:

ptr = memchr(str1, '4', sizeof(str1));
if (ptr)
{
  // do stuff using ptr;
}

执行memchr并分配返回值,然后执行if。像这样:

ptr = memchr(str1, '4', sizeof(str1));
if (ptr)
{
  // do stuff using ptr;
}

赋值运算符返回被赋值的值,这(以及右关联性)就是为什么
a=b=c工作。因此,您的第一个示例将很好地工作。

赋值运算符返回被赋值的值,这就是为什么
a=b=c工作。因此,您的第一个示例将很好地工作。

不,您的第一个陈述不正确。如果执行
If(ptr=memchr(…){}
操作,则如果字符未定位,则不会输入If块,因为
memchr()
返回
NULL
,该值依次计算为false。请注意,如果
str1
是指针而不是数组,则
sizeof(str1)
将不会执行预期的操作。在第一个选项中,它不是在计算NULL,而是在计算NULL对ptr的赋值,赋值将返回true,就像您编写“if(ptr=0)”或“if(ptr=1)”--赋值成功完成并返回1。@Rancur3p1c:assignment返回赋值表达式的值。这就是为什么像
a=b=c工作。你真的试过了吗?你把
=
=
混淆了吗?@Rancur3p1c:不,你错了。赋值运算符总是返回被赋值的值(本例中为NULL),而不是“如果成功则返回1”。它不是一个比较运算符——像
a=b=c=0
这样的链接赋值之所以有效,是因为它返回被赋值的值,并从右向左绑定。不,您的第一个语句不是真的。如果执行
If(ptr=memchr(…){}
操作,则如果字符未定位,则不会输入If块,因为
memchr()
返回
NULL
,该值依次计算为false。请注意,如果
str1
是指针而不是数组,则
sizeof(str1)
将不会执行预期的操作。在第一个选项中,它不是在计算NULL,而是在计算NULL对ptr的赋值,赋值将返回true,就像您编写“if(ptr=0)”或“if(ptr=1)”--赋值成功完成并返回1。@Rancur3p1c:assignment返回赋值表达式的值。这就是为什么像
a=b=c工作。你真的试过了吗?你把
=
=
混淆了吗?@Rancur3p1c:不,你错了。赋值运算符总是返回被赋值的值(本例中为NULL),而不是“如果成功则返回1”。它不是一个比较运算符——像
a=b=c=0
这样的链接赋值之所以有效,是因为它返回被赋值的值,并从右向左绑定。尽管OP的“问题”根本不是问题,我喜欢这个建议,因为它避免了混淆赋值和比较的可能性。尽管OP的“问题”根本不是问题,但我喜欢这个建议,因为它避免了混淆赋值和比较的可能性。