首页 > 解决方案 > 将 unsigned char 与整数文字进行比较

问题描述

#include <stdio.h>

int main()
{
    unsigned char voto;

    printf("Inserire il voto (da 2 a 10): ");
    scanf("%d", &voto);

    printf("\n\n\n%d ", voto);

    if(voto > 1 && voto < 11)
    {
        printf("corrisponde al giudizio ", voto);

        switch(voto)
        {
            case 2:
            case 3:
            case 4:
            case 5:
                printf("INSUFFICIENTE");
                break;
            case 6:
                printf("SUFFICIENTE");
                break;
            case 7:
                printf("DISCRETO");
                break;
            case 8:
                printf("BUONO");
                break;
            case 9:
                printf("MOLTO BUONO");
                break;
            case 10:
                printf("OTTIMO");
                break;
        }
    } else
    {
        printf("non e' un voto valido!");
    }

    printf("\n\n----------------------------");


    return 0;
}

我将复制老师发给我的消息:

当 IF 比较 CHAR 和数字常量时,可能会发生两件事:要么将数字常量转换为 UNSIGNED CHAR 并按字母顺序与“voto”进行比较,要么将“voto”转换为 INT 并与字面上的数字。在这两种情况下,您都强制处理器执行强制转换,在第一种情况下,程序可能无法正常工作:按字母顺序,这将是正确的顺序:1 11 111 2 222 23 这里有 2 个结果大于 11 和 111,以及 23结果大于 222。

这种比较不是总是会导致 VOTO 被转换为 INT,而不是相反吗?而且,如果文字被转换为 UNISGNED CHAR,程序不会以同样的方式工作吗?

标签: ccastingchar

解决方案


如果这正是您提交的程序,那么您的老师没有很好地阅读您的代码。有一个完全不同的问题。

如果您写了,scanf("%c", &voto);那么您的老师的评论将具有一定的意义,尽管它们似乎暗示 C 可能会将字符“1”转换为值 1,但事实并非如此。如果你真的只期望一个字符,你可以侥幸逃脱,尽管你必须改变你voto与字符文字比较的所有其他值,因为'1'例如 character 的值是 49。无论如何,那是不起作用,因为您显然需要能够阅读数字 10,这是两个字符长。

但是您是正确的,unsigned char将转换为int.

在您的实际程序中,或者至少在此处粘贴的程序中,您实际上已经编写了

scanf("%d", &voto);

这当然是正确的。%d转换说明符必须有一个指向 an 的指针作为int其对应的参数;因为它没有,所以它是未定义的行为。在实践中,很可能scanf将给定的指针视为指向不存在的指针int,这意味着碰巧在 附近的局部变量voto将被覆盖。(可能会发生更糟糕的事情;这只是为了给你一个想法。)


推荐阅读