C搞笑循环

C搞笑循环,c,loops,for-loop,pointers,c-strings,C,Loops,For Loop,Pointers,C Strings,下面是我的一位同事在我现在使用的一些遗留代码中使用的代码片段。代码运行,for循环的主体只执行五次。我不明白为什么直到n等于100时才会执行 有人有解释吗?这将是非常有用的,因为我的公司正在保留此代码,我必须帮助维护它。提前谢谢 #include <stdio.h> int main(int argc, char const *argv[]) { int i, n = 100, *d=&n, *s=&n; for (i = 0; i < n &a

下面是我的一位同事在我现在使用的一些遗留代码中使用的代码片段。代码运行,for循环的主体只执行五次。我不明白为什么直到n等于100时才会执行

有人有解释吗?这将是非常有用的,因为我的公司正在保留此代码,我必须帮助维护它。提前谢谢

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int i, n = 100, *d=&n, *s=&n;
    for (i = 0; i < n && (*d++ = *s++); ++i)
    {
        printf("i = %d; n = %d; *d = %p; *s = %p;\n", i, n, d, s);
    }
    return 0;
}
#包括
int main(int argc,char const*argv[]
{
整数i,n=100,*d=&n,*s=&n;
对于(i=0;i
呈现的程序具有未定义的行为,因为在第一次赋值之后,该行为没有意义

(*d++ = *s++)
指针
d
s
指向对象
n
之外,并且在其增量后取消引用此类指针会导致未定义的行为

我可以想象以下类似的方法对于复制字符串是有效的,如下面的演示程序所示

#include <stdio.h>

int main(void) 
{
    const char *s1 = "Hello World!";
    enum { N = 20 };
    char s2[N];

    const char *p1 = s1;
    char *p2 = s2;

    for ( int i = 0; i < N && ( *p2++ = *p1++ ); i++ )
    {
        printf( "%*.*s\n", ( i + 1 ), ( i + 1 ), s2 );
    }

    return 0;
}
然而,在这种情况下,使用标准C函数
strncpy
比使用循环要好得多,也更简单


循环的唯一优点是,如果还需要获取复制的符号数(不包括终止的零)。

这是一个可怕、可怕的代码。也许只是重写循环以使其有意义?不仅是糟糕的代码,还会导致无效的代码。@Nodedesign现在非常有趣,雇用这种程序员的公司的名称是什么?:)我怀疑这不是实际的代码,而实际的代码是一个类似于
strncpy
的例程,它将字符串
s
中的
n
个字符复制到数组/指针
d
,作为参数传递,而不是初始化为指向
n
。如果代码确实如您所示,他们为什么要保留代码?该计划的明确目的是什么?相反,如果您将实际代码改编为一个简短的示例,请返回并确保您的示例真实反映了实际使用的代码。我想添加C中NULL的ASCII值为零。因此,一旦遇到字符串结尾,(*d++=*s++)将返回0,使条件为假。这将终止循环
H
He
Hel
Hell
Hello
Hello 
Hello W
Hello Wo
Hello Wor
Hello Worl
Hello World
Hello World!