c/c++开发分享当一个`int`处于最大值并使用postfix ++进行测试时,代码是否定义良好?

示例未定义行为的示例是整数溢出的行为。 C11dr§3.4.33

int overflow是未定义的行为,但这是否适用于存在循环的以下内容,并且不使用现在超出范围的i的副作用? 特别是,这个Postfix增量规范有帮助吗?

…在更新操作数的存储值的副作用之前,对结果的值计算进行排序。 ……§6.5.2.42

使用启用良好的C11编译时没有警告

 #include  #include  int main(void) { // Specified behavior when `i` has the value `INT_MAX`? for (int i = INT_MAX - 2; i++ < INT_MAX;) { printf("%dn", i); } puts("Done"); return 0; } 

样本输出

 2147483646 2147483647 Done 

当然可以重写代码以避免下面的这种窘境。 仍然,寻找有关上述的确认。 (我认为是UB。) INT_MINi--存在类似的问题。

  for (int i = INT_MAX - 2; i < INT_MAX;) { i++; printf("%dn", i); } 

 GNU C11 (GCC) version 5.3.0 (i686-pc-cygwin) compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3 '-std=c11' '-O0' '-g3' '-Wpedantic' '-Wall' '-Wextra' '-Wconversion' '-c' '-fmessage-length=0' '-v' '-MMD' '-MP' '-MF' xx.o' '-o' 'xx.o' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/5.3.0/cc1.exe -quiet -v -MMD xx.d -MF xx.d -MP -MT xx.o -dD -Dunix -idirafter ... xx.c 

    无论范围是什么,当i为2147483647时(假设系统上的INT_MAX = 2147483647),程序在i++的评估中具有未定义的行为。

    您的示例可以重写为:

     include  int main(void) { // Specified behavior when `i` has the value `INT_MAX`? { int i = INT_MAX; i++; } puts("Done"); return 0; } 

    无论是使用计算值还是在下一个序列点之后该对象不再存在, i++的值计算都会导致整数溢出; 对象的序列点或存储持续时间与此处是否存在未定义的行为无关。

    代码具有未定义的行为。 表达式i++导致i+1评估和结果分配给i ,并且i+1的评估具有未定义的行为。 不使用i+1的结果或新存储的i值并不重要。 UB不是使用结果的问题。 同样, 0*(INT_MAX+1)具有UB。

      以上就是c/c++开发分享当一个`int`处于最大值并使用postfix ++进行测试时,代码是否定义良好?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545904.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注