鱼C论坛

 找回密码
 立即注册
查看: 1699|回复: 9

[已解决]关于字符串常量赋值给字符变量的疑惑?

[复制链接]
发表于 2021-9-16 16:23:29 | 显示全部楼层 |阅读模式
10鱼币
临近计算机二级考试,考前抱佛脚,从图书馆借了本《计算机等级考试二级 C 语言考点精解及全真模型(上)》康康题型。有一例题以下定义语句中正确的是____,选项 B 是这样的
char A = 65+1, b = "b";
答案竟然就是选项 B?
,我往 Microsoft Visual C++ 2010 学习版 中输入试试看:
/* 环境:Microsoft Visual C++ 2010 学习版
 * 文件名:assign.c
 * 作用:理解赋值表达式
 * 日期:2021 年 9 月 16 日
 */
#include <stdio.h>
#include <Windows.h>

int main( )
{
        char A = 65+1, b = "b";

        printf("A: %c\nb: %c%\n", A, b);

        system("pause");
        return 0;
}

assign.c

assign.c

直接提示类型错误:
类型错误.jpg
我直接按下 fn+F5 编译运行:
编译运行assign.c.jpg

这是为什么呢?难道将字符串
"b"
的地址赋值给了字符变量
b

往其中加入一行输出语句试试看:
/* 环境:Microsoft Visual C++ 2010 学习版
 * 文件名:assign.c
 * 作用:理解赋值表达式
 * 日期:2021 年 9 月 16 日
 */
#include <stdio.h>
#include <Windows.h>

int main( )
{
        char A = 65+1, b = "b";

        printf("%p\n", b);

        printf("A: %c\nb: %c%\n", A, b);

        system("pause");
        return 0;
}
再来一次
输出地址.jpg
十六进制 00000058 转换成十进制整数表示就是 88 正好是大写字母 X 对应的 ASCII 码值。
不知道我的想法对不对呢?
最佳答案
2021-9-16 16:23:30
本帖最后由 人造人 于 2021-9-16 18:23 编辑

B 怎么能是对的呢
B 是对的,也就是说,A、C、D 都直接无法通过编译?
char b = "b";
这个会把字符串 "b" 的首地址赋值给变量 b
这个地址有可能是 32 位 4 个字节,也有可能是 64 位 8 个字节
不管多少位,只要最低字节
你想的基本是对的,只是用来测试的代码是不对的
应该是下面这样,运行下面这个代码,你再看看输出结果
/* 环境:Microsoft Visual C++ 2010 学习版
 * 文件名:assign.c
 * 作用:理解赋值表达式
 * 日期:2021 年 9 月 16 日
 */
#include <stdio.h>
#include <Windows.h>

int main( )
{
        char A = 65+1, b = "b";

        printf("%p\n", "b");

        printf("A: %c\nb: %c\n", A, b);

        return 0;
}


选项 B 是错的,如果 A、C、D 都无法通过编译,那就选 B 吧,毕竟是考试


最佳答案

查看完整内容

B 怎么能是对的呢 B 是对的,也就是说,A、C、D 都直接无法通过编译? char b = "b"; 这个会把字符串 "b" 的首地址赋值给变量 b 这个地址有可能是 32 位 4 个字节,也有可能是 64 位 8 个字节 不管多少位,只要最低字节 你想的基本是对的,只是用来测试的代码是不对的 应该是下面这样,运行下面这个代码,你再看看输出结果 选项 B 是错的,如果 A、C、D 都无法通过编译,那就选 B 吧,毕竟是考试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 16:23:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2021-9-16 18:23 编辑

B 怎么能是对的呢
B 是对的,也就是说,A、C、D 都直接无法通过编译?
char b = "b";
这个会把字符串 "b" 的首地址赋值给变量 b
这个地址有可能是 32 位 4 个字节,也有可能是 64 位 8 个字节
不管多少位,只要最低字节
你想的基本是对的,只是用来测试的代码是不对的
应该是下面这样,运行下面这个代码,你再看看输出结果
/* 环境:Microsoft Visual C++ 2010 学习版
 * 文件名:assign.c
 * 作用:理解赋值表达式
 * 日期:2021 年 9 月 16 日
 */
#include <stdio.h>
#include <Windows.h>

int main( )
{
        char A = 65+1, b = "b";

        printf("%p\n", "b");

        printf("A: %c\nb: %c\n", A, b);

        return 0;
}


选项 B 是错的,如果 A、C、D 都无法通过编译,那就选 B 吧,毕竟是考试


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 16:43:41 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-16 16:46 编辑

char *b = "b";
或者 char b='b';
除非char b=(char)"b";
才能通过编译
估计你那个b值是变量未初始化的随机值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 17:09:17 | 显示全部楼层
C语言里双引号内容表示字符串   并不能表示单个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 17:30:32 | 显示全部楼层
你最后猜的不对
地址值和ASCII码值没有关系
你多次运行,地址值可能不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 18:43:32 | 显示全部楼层
人造人 发表于 2021-9-16 18:21
B 怎么能是对的呢
B 是对的,也就是说,A、C、D 都直接无法通过编译?
char b = "b";

选项 A:
int a=b=0;
选项 C:
float a=1, *b=&a, *c=&b;
选项 D:
double a=0.0; b=1.1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 18:54:36 | 显示全部楼层
Cardist 发表于 2021-9-16 18:43
选项 A:

选项 C:

选项 A 和 D 是错的,语法错误
看选项 C
$ gcc -g -Wall -o main main.c
main.c: In function ‘main’:
main.c:4:26: warning: initialization of ‘float *’ from incompatible pointer type ‘float **’ [-Wincompatible-pointer-types]
    4 |     float a=1, *b=&a, *c=&b;
      |                          ^
main.c:4:24: warning: unused variable ‘c’ [-Wunused-variable]
    4 |     float a=1, *b=&a, *c=&b;
      |                        ^
$

选项 C 这算错吗?
选项 C 是 二级指针转一级指针
选项 B 是 一级指针转整数,而且截短到一个字节
B 和 C 哪一个是对的?我想请出题的那个人来解答这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 18:59:12 | 显示全部楼层
其实不必纠结,考试而已,选 "正确" 的那个就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 19:16:00 | 显示全部楼层
人造人 发表于 2021-9-16 18:54
选项 A 和 D 是错的,语法错误
看选项 C

估计甩锅给编辑的错
“B选项本来原稿是两个单引号'',纸质版错成了双引号""
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 19:17:19 | 显示全部楼层
Cardist 发表于 2021-9-16 19:16
估计甩锅给编辑的错
“B选项本来原稿是两个单引号'',纸质版错成了双引号""”

^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 07:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表