You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有符号整数溢出后的变量未被使用,是否会触发未定义行为?

该C语言程序是否存在未定义行为?

给定程序

#include <limits.h>

int main (void) {
    int i = 0;

    // 假设用户严格遵循输入要求..
    printf ("Enter a number in the range [0 - INT_MAX] : \n"); 
    scanf ("%d", &i);

    while (i++ < INT_MAX) {
        // 执行一些操作..
        // 循环体内未使用变量i的值
    }

    // 循环体之后未在任何地方使用变量i的值

    return 0;
}

问题背景

当循环执行到最后一次判断时,i的值为INT_MAX,此时i++ < INT_MAX的表达式会先以INT_MAX作为判断值(结果为假,循环退出),但后置自增的副作用会使i变为INT_MAX + 1,这会触发有符号整数溢出。而溢出后的i值在程序后续未被使用,请问该程序是否存在未定义行为?

结论与标准依据

该程序存在未定义行为,依据来自C语言标准(以C17为例)的条款:

6.5 表达式 第5段:如果在表达式求值过程中出现异常条件(即结果在数学上无定义,或不在其类型的可表示值范围内),则行为是未定义的。

具体来说,后置自增操作i++的副作用是对i执行i = i + 1的操作,当i为INT_MAX时,i + 1的结果超出了有符号int类型的可表示范围,属于上述条款中“结果不在类型可表示范围内”的情况。无论溢出后的i值是否被后续代码使用,只要触发了有符号整数溢出,就会导致未定义行为。

内容的提问来源于stack exchange,提问作者H.S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:29:55