C 整数关闭,可能溢出

标签 c integer integer-overflow

我正在尝试编写一个 C 程序来计算并打印用户输入的制表符、空格和行数。问题是当它打印这些数字时,它们完全不对。这是我的程序代码:

int c, b, t, nl;
b, t, nl = 0, 0, 0;
while ((c = getchar()) != EOF) 
{
    if (c == '\b') 
        b++;
    if (c == '\t') 
        t++;
    if (c == '\n') 
        nl++;
}
printf("b=%d t=%d nl=%d\n", b, t, nl);

当我从终端输入一些数据时(3 行,一个空格,一个制表符),结果是 b=1899313536,t=32768,nl=3。

最佳答案

问题出在这一行:

b, t, nl = 0, 0, 0;

它在赋值的两边都使用逗号运算符,因此只有 nl 被初始化为零。 bt 左侧*和右侧两个尾随零的计算没有副作用 = 运算符(注意该赋值比逗号运算符具有更高的优先级)。

将其更改为:

b = t = nl = 0;

这实际上意味着(因为 = 运算符具有正确的结合性):

b = (t = (nl = 0));

*除非 bt 被声明为 volatile(因为读取此类对象被 C 算作副作用标准)

关于C 整数关闭,可能溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27735283/

相关文章:

Java ArrayList get() 作为整数而不是对象

c++ - INT_MAX+a-b 不会导致溢出但 INT_MAX*a/b 会导致溢出(如果 a>1 且 a=b)吗?

c++ - 二进制搜索中 mid=(beg+end)/2 和 mid=beg+(end-beg)/2 有什么区别?

c - 为什么 FreeRTOS 中需要程序集包装器?

c - 我释放了一切,但内存泄漏

c - 如何知道头文件里面有什么?

c - 从 stdin 获取奇怪的输出读数

php rand() 函数显示负值

c++ - 检查输入是C++中的数字还是字符串

c# - 永远增加你得到-2147483648?