5

char通过简单的加法和测试数字何时变为负数来找到 a 的最大值:

#include<stdio.h>

/*find max value of char by adding*/
int main(){
  char c = 1;

  while(c + 1 > 0)
    ++c;

  printf("Max c = %d\n",(int)c);  /*outputs Max c = -128*/
  return 0;
}

循环在while前面测试,所以第一次c+1是负的,它会中断,我们打印c. 但是,编程输出的是负数!

为什么这个程序不输出127

4

2 回答 2

5

在 while 条件中发生了一个隐式转换,这导致比较在整数而不是字符上工作。

如果您将其更改为

while((char)(c + 1) > 0)
    ++c;

然后它将打印 127。

于 2016-07-25T20:00:25.660 回答
0

有符号整数溢出是未定义的行为。这意味着允许符合标准的 C 编译器更改c + 1 > 0true,因为加法“不能”溢出。

这意味着您的程序可以合法地编译为无限循环。

于 2016-07-25T20:03:50.957 回答