C语言中判断char类型运算符的if语句不生效是什么原因?
问题原因
- 变量类型匹配错误:你定义的
operator是char operator[1]字符数组类型,数组名在参与运算时默认退化为指向数组首地址的指针。if(operator =='+')这行代码实际是把数组的内存地址和字符常量'+'的ASCII值(43)做对比,二者永远不可能相等,因此判断分支永远无法触发。 - 你看到
printf("You wrote %s\n", operator);输出正常属于巧合:%s格式化符要求传入字符指针,你的数组名刚好符合参数要求,但因为你只分配了1字节的数组空间,存储输入的'+'后没有多余位置存储字符串结束符'\0',这行printf本身属于未定义行为,只是运行时刚好数组后续内存的值为0,才没有出现乱码输出。
修复方案
两种方案选一种即可:
方案1:将operator改为普通char类型(更推荐)
修改代码如下:
float number1; float number2; float total; // 改为char类型,不是数组 char operator; printf("Welcome to the calculator\n"); while(1) // 等价于3>2,写法更规范 { printf("Pick a number\n"); scanf("%f", &number1); printf("Que quieres hacer?\n"); scanf(" %c", &operator); // 用%c输出单个字符,更安全 printf("You wrote %c\n", operator); if(operator =='+') { printf("This works!"); } }
方案2:保留数组类型,判断时取数组首个元素
如果要保留数组定义,修改if判断条件即可:
// 取数组第一个元素和'+'比较 if(operator[0] == '+') { printf("This works!"); }
内容的提问来源于stack exchange,提问作者Explosivo30
相关产品推荐
相关产品推荐

