C 为什么这会创建一个无限的负奇数列表?
如果i=1,为什么下面的指令会创建负数的无限列表(-1,-3,-5…) 原因是C 为什么这会创建一个无限的负奇数列表?,c,infinite,C,Infinite,如果i=1,为什么下面的指令会创建负数的无限列表(-1,-3,-5…) 原因是i--是后减量运算符。也就是说,在表达式中使用i的值,然后对表达式本身进行求值。这导致比较中i的值与print语句中的值不同,print语句构成无限循环 i--后减量操作,告知要使用的值 首先是表达式求值 --i预减量操作,它告诉表达式 首先求值,然后使用表达式的结果 原因是i--是后减量运算符。也就是说,在表达式中使用i的值,然后对表达式本身进行求值。这导致比较中i的值与print语句中的值不同,print语句构成无
i--
是后减量运算符。也就是说,在表达式中使用i的值,然后对表达式本身进行求值。这导致比较中i的值与print语句中的值不同,print语句构成无限循环
i--
后减量操作,告知要使用的值
首先是表达式求值--i
预减量操作,它告诉表达式
首先求值,然后使用表达式的结果i--
是后减量运算符。也就是说,在表达式中使用i的值,然后对表达式本身进行求值。这导致比较中i的值与print语句中的值不同,print语句构成无限循环
i--
后减量操作,告知要使用的值
首先是表达式求值--i
预减量操作,它告诉表达式
首先求值,然后使用表达式的结果请注意,上述副作用可能发生在表达式其余部分求值之前或之后(甚至在求值期间)。而
条件使用后减量。这意味着它测试i
的原始值,即1
,然后将该值减至0
。因为1
是真实的,所以它进入循环
在循环内部,打印--i
。这是预减量,因此它将i
设置为-1
,并打印该值
在下一次迭代中,同样的事情发生了。它测试真实的-1
,将其递减为-2
,进入循环体,将其递减为-3
,并打印该值
最后,当i
溢出到最小负数以下时,代码将运行到未定义的行为。在大多数实现中,它将环绕并继续相同的进程,但实际行为不受语言的限制。而条件使用后减量。这意味着它测试i
的原始值,即1
,然后将该值减至0
。因为1
是真实的,所以它进入循环
在循环内部,打印--i
。这是预减量,因此它将i
设置为-1
,并打印该值
在下一次迭代中,同样的事情发生了。它测试真实的-1
,将其递减为-2
,进入循环体,将其递减为-3
,并打印该值
最后,当i
溢出到最小负数以下时,代码将运行到未定义的行为。在大多数实现中,它将环绕并继续相同的进程,但实际行为并不是语言所特有的。在每次迭代中,我将递减2次,这就是序列1、-1、-3,依此类推。始终为正值,这将导致无限循环。若你们选择i=2,那个么级数将是2,0,仅此而已。在得到零之后,循环将退出。在每次迭代中,我将递减2次,这就是序列1、-1、-3,依此类推。始终为正值,这将导致无限循环。若你们选择i=2,那个么级数将是2,0,仅此而已。在得到零后,循环将退出。i
似乎属于int
类型,并且是一个带符号整数,它也覆盖负范围
该标准要求int
必须能够表示至少一系列−32767
至32767
如果减小该值,则该值可以降到INT\u MIN
如果在到达INT\u MIN
的边界后减小该值,则该行为未定义
i
在每次迭代中被2
递减,因此输出显示出2个步骤的减少
如果循环是无限的,则取决于实现如何处理INT\u MIN
之后的递减
只要i
为非零,while
条件始终为真,这里的情况就是这样的,i
在第一次迭代时被减2,此后,i
也是负的。i
似乎属于int
类型,并且是一个带符号的整数,它也覆盖了负范围
该标准要求int
必须能够表示至少一系列−32767
至32767
如果减小该值,则该值可以降到INT\u MIN
如果在到达INT\u MIN
的边界后减小该值,则该行为未定义
i
在每次迭代中被2
递减,因此输出显示出2个步骤的减少
如果循环是无限的,则取决于实现如何处理INT\u MIN
之后的递减
只要i
为非零,while
条件始终为真,这里就是这种情况,因为i
在第一次迭代时递减2,此后i
也是负的。因为从奇数2中减去2,在大多数实现中它永远不会为零
while (i--)
if(i & 1) printf("\n%i", i);
将在某个点停止。因为从奇数2中减去2,所以在大多数实现中它永远不会为零
while (i--)
if(i & 1) printf("\n%i", i);
将在某个点停止。没有任何错误
while (i--)
if(i & 1) printf("\n%i", i);