以下是引用lxk1732942在2018-11-30 15:18:14的发言:
突破范围后不就该变为负数吗?书上甚至还有其变化过程,最大值加1就变成最小负数了,我用的确实是谭浩强的书,但是没感觉溢出变负数有啥问题啊。新手一枚,求教
可是C标准不是这么规定的呀,C标准规定
具符号类型的溢出是未定义行为(
无符号类型的溢出则是良好定义行为)
以 for( int k=INT_MAX; k>0; ++k ){} 为例,编译器在优化时
可能直接就将其作为死循环对待,即优化成 while( 1 );
因为 k溢出属于未定义行为,编译器根本无须考虑任何未定义行为,那么k在正常行为下就一直大于0,即死循环。(编译器只须要保证正确行为正确就行,不需要保证错误行为正确,也不需要保证错误行为一定错误)
谭浩强是根据 Turbo C 编译器来瞎猜C标准的,在TC中正确的,可能确实应该正确,也可能是TC的“实现定义”,也可能是TC的“未定义”;同样,在TC中错误的,也有可能只是TC的bug。
用《谭浩强》来学C语言,无异于向神婆学现代物理。