【问题标题】:while loop unexpected (character to int conversion)while 循环意外(字符到 int 的转换)
【发布时间】:2014-05-17 02:48:56
【问题描述】:
#include<stdio.h>
main()
char i=13;
while(i)
{
i++;
}
printf("%d",i);
}

输出结果为零。怎么会这样

#include<stdio.h>
main()
char i=48;
if(i)
{
printf("%d",i);
}
   }

这个程序成功运行并打印 48。我不是认为它应该失败的字符 o 吗?我是如何作为字符或数字存储在内存中的

【问题讨论】:

  • 首先正确缩进你的代码。
  • 第一个循环环绕到i = 0。将printf 移动到循环中以查看发生的情况。在第二个printf 中,i%d 转换为int。使用%c 将其打印为字符。
  • 如果您的代码缩进正确,那么缺少的{ 会很明显。

标签: c loops while-loop char int


【解决方案1】:

if 语句比较的是数值,而不是它所代表的 ASCII 字符。在第二个示例中,只有数值 0 会导致 if 无法执行。

【讨论】:

  • A C 实现可能没有使用 ACSII 我相信 char i = 48 将是数字 0
  • 嗯,在 ASCII(或 UTF8)中,十进制 48 是数字 0 的字符代码,但这并不重要。它比较的是整数值(在这种情况下为 48),而不是可能代表的任何字符。为此,将 char 视为 8 位整数。
【解决方案2】:

'main()' 后面缺少一个括号。您的第一个代码实际上一直从 13 开始计数,直到达到 127(如果在您的系统上,字符表示为有符号整数),因为这是此类系统上字符的最大正整数;然后翻转到 -128 并一直计数到 0。在 0 处,您退出循环并打印结果。要形象化会发生什么,请复制并尝试一下:

#include <stdio.h>

int main()
{
    char i=13;
    while(i){
        i++;
        printf("%d ", i);
    }

    printf("\n%d",i);
}

输出:

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 5652 53 5 54 9 61 62 63 64 65 66 67 68 69 70 71 72 73 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 1001010101010304 105 106 107 108 109 110 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 -128 -127 -126 -125 -124 -123 -122 -121 -120 -119 -118 -117 -1116 -115 -1 112 -111 -110 -109 -108 -107 -106 -105 -104 -103 -102 -101 -100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 - 87 -86 -85 -84 -83 -82 -81 -80 -79 -78 -77 -76 -75 -74 -73 -72 -71 -70 -69 -68 -67 -66 -65 -64 -63 - 62 -61 -60 -59 -58 -57 -56 -55 -54 -53 -52 -51 -50 -49 -48 -47 -46 -45 -44 -43 -42 -41 -40 -39 -38 - 37 -36 -35 -34 -33 -32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 - 12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0

从正面到负面的变化与计算机上整数的 IEEE 表示有关。如果你用谷歌搜索,你可以找到很多关于 SO 的相关问题。

【讨论】:

  • "IEEE" 通常指的是一组特定的浮点表示标准。可能有一个整数表示的 IEEE 标准,但通常我们只指 2 的补码(或 1 的补码或符号和幅度,这些比较少见)。
猜你喜欢
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
相关资源
最近更新 更多