Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 解释程序的结果?_C_Output - Fatal编程技术网

C 解释程序的结果?

C 解释程序的结果?,c,output,C,Output,以下c程序的输出为, 输出:1,2,3,4。。。。。。。。126,127,-128,-127 .... -2,-1 ? #include <stdio.h> #include <string.h> int main() { char i=0; for(i<=5 && i>=-1 ; ++i;i>0) printf("%d\n",i); printf("\n"); return 0; #包括 #包括

以下c程序的输出为, 输出:1,2,3,4。。。。。。。。126,127,-128,-127 .... -2,-1 ?

#include <stdio.h>
#include <string.h>

int main()
{
   char i=0;
   for(i<=5 && i>=-1 ; ++i;i>0)
     printf("%d\n",i);
   printf("\n");
   return 0;
#包括
#包括
int main()
{
字符i=0;
对于(i=-1;++i;i>0)
printf(“%d\n”,i);
printf(“\n”);
返回0;
}


请解释为什么会这样?

它被称为溢出。类型“char”使用RAM容量的1字节,因此它只能存储256个值。这些是[-128127]。当你试图超过127时,它将返回最低值

除此之外,您的for循环有点混乱。试一试

for ( i = 0 ; i <= 5 ; ++i ) // This will print 0,1,2,3,4,5
    printf( "%d\n" , i );
for(i=0;i因为:

for(i<=5 && i>=-1 ; ++i;i>0)
递增i,当i为零时终止

3) 每次循环执行的语句(通常为递增/递减):

什么也不做


因此,您的代码从i=0开始循环,直到它再次为零。我猜您使用for循环的方式不正确

for(i=-1;++i;i>0)

上述代码意味着:

  • 在做任何事情之前,先评估
    i=-1
    (这不会有任何副作用,所以不会发生任何事情)
  • 在每次迭代中,递增
    i
    ,然后检查它是否为零。如果它不是零,则运行另一个迭代
  • 在每次迭代结束时,计算
    i>0
    (同样,它什么也不做)
  • 因此,您的循环简化为

    while(++i)


    为了解释您的结果,您正在使用的系统很可能将字符实现为带符号整数,当字符大于127时,它将“包装”为负数(因为8位2的补码整数中的128是-128)

    首先,字符占用1个字节,并且是带符号的。 借助8位(1字节)的帮助,您可以表示的数字范围是

    **-(2^(8-1)) to +((2^(8-1)) -1) [ie from -128 to +127].**
    
    在您的代码中,您正在递增i,并打印相同的值。 一旦我达到127(二进制011111=127),你再次增加它成为(10000000),也就是-128

    打印时使用的是%d。所以输出将是整数格式。 这就是为什么它要打印1,2,3-128,-127

    如果您不明白1000 0000是-128,请阅读


    这是您的代码分解,它相当狡猾:

    for( i <= 5 && i >= -1 ; ++i; i > 0)
    
    。。。现在,如果您注意到在for循环之前已将
    i
    初始化为0。接下来要做的是递增
    i
    ,然后返回它的值(请参阅),因此它将从1-1(在127处溢出)。这是因为在C中,任何非零值都是
    true
    ,0是
    false
    。因此,一旦
    i
    变为0,它将停止运行循环<代码>i
    只能通过溢出变为零


    您的第三条语句无关紧要,它是不相关的。

    char
    是一个有符号的8位值。我认为您稍微混合了for循环的组件。@Joe它是在OPs编译器中签名的,但不必这样。它是指定的实现。请将
    void
    参数添加到
    main()
       i > 0
    
    **-(2^(8-1)) to +((2^(8-1)) -1) [ie from -128 to +127].**
    
    for( i <= 5 && i >= -1 ; ++i; i > 0)
    
    for( ; ++i; i > 0)