Cardist 发表于 2021-9-16 16:23:29

关于字符串常量赋值给字符变量的疑惑?

临近计算机二级考试,考前抱佛脚,从图书馆借了本《计算机等级考试二级 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;
}


直接提示类型错误:

我直接按下 fn+F5 编译运行:

{:10_277:}
这是为什么呢?难道将字符串
"b"
的地址赋值给了字符变量
b
{:9_241:}
往其中加入一行输出语句试试看:
/* 环境: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;
}

再来一次

{:10_256:} 十六进制 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 吧,毕竟是考试


jhq999 发表于 2021-9-16 16:43:41

本帖最后由 jhq999 于 2021-9-16 16:46 编辑

char *b = "b";
或者 char b='b';
除非char b=(char)"b";
才能通过编译
估计你那个b值是变量未初始化的随机值

wp231957 发表于 2021-9-16 17:09:17

C语言里双引号内容表示字符串   并不能表示单个字符

Max472 发表于 2021-9-16 17:30:32

你最后猜的不对
地址值和ASCII码值没有关系
你多次运行,地址值可能不一样

Cardist 发表于 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;

人造人 发表于 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 哪一个是对的?我想请出题的那个人来解答这个问题

人造人 发表于 2021-9-16 18:59:12

其实不必纠结,考试而已,选 "正确" 的那个就可以了

Cardist 发表于 2021-9-16 19:16:00

人造人 发表于 2021-9-16 18:54
选项 A 和 D 是错的,语法错误
看选项 C



估计甩锅给编辑的错
“B选项本来原稿是两个单引号'',纸质版错成了双引号""”{:10_256:}

人造人 发表于 2021-9-16 19:17:19

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

^_^
页: [1]
查看完整版本: 关于字符串常量赋值给字符变量的疑惑?