c - 将 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,程序不会以同样的方式工作吗?
解决方案
如果这正是您提交的程序,那么您的老师没有很好地阅读您的代码。有一个完全不同的问题。
如果您写了,scanf("%c", &voto);
那么您的老师的评论将具有一定的意义,尽管它们似乎暗示 C 可能会将字符“1”转换为值 1,但事实并非如此。如果你真的只期望一个字符,你可以侥幸逃脱,尽管你必须改变你voto
与字符文字比较的所有其他值,因为'1'
例如 character 的值是 49。无论如何,那是不起作用,因为您显然需要能够阅读数字 10,这是两个字符长。
但是您是正确的,unsigned char
将转换为int
.
在您的实际程序中,或者至少在此处粘贴的程序中,您实际上已经编写了
scanf("%d", &voto);
这当然是不正确的。%d
转换说明符必须有一个指向 an 的指针作为int
其对应的参数;因为它没有,所以它是未定义的行为。在实践中,很可能scanf
将给定的指针视为指向不存在的指针int
,这意味着碰巧在 附近的局部变量voto
将被覆盖。(可能会发生更糟糕的事情;这只是为了给你一个想法。)
推荐阅读
- python - cv2.findContours 在黑色背景上找不到白色矩形
- node.js - 将 React 与 Electron 一起使用,以便仍然可以使用 Node.js 原生模块
- python - 指定方法的参数类型和返回类型有什么好处?
- amazon-web-services - 在 API Gateway 和 Lambda 函数中重复输入验证?
- html - css - 剪辑图像并添加边框以适合 div
- visual-studio-code - Xdebug 3.0 WSL2 和 VSCode - 有效的配置
- redis - 即使值存在,redis get 也返回 null
- javascript - 为什么日期比较 javascript 功能不起作用?
- javascript - 如何使用带有 Vue 的 HTML 5 验证添加错误消息
- docker - Docker以非交互方式设置用户密码