C语言基本概念——正确理解C,不要被错误的题目误导

在进行C语言训练或做题时,我们可能会遇到一些看似简单但实则错误的题目。这些题目可能会误导我们对C语言基本概念的认识。因此,正确理解C语言并辨别题目中的错误至关重要。下面,举例说明题目错在哪。

1. 写出下列程序的运行结果。

#include <stdio.h>
int main()
{int a, b[4]={'a','b','c','d'};a= 'm';putchar(a);puts(b) ;  return 0;
}

本题给出的正确结果是ma。为什么?

分析: 第6行输出一个字符’m‘,第7行输出一个字符串,该字符串是“a”,因为b是一个整型数组,b的地址与b[0]的地址一样,如果整型数占4个字节,b[0]的4个字节在存储器中存储的数值从低地址到高地址分别是 ‘a'、0、0和0。如果把b[0]强制转换为一个字符串,则该字符串是“a",所以,本程序输出ma。

上面的分析头头是道,但是,它是错的,因为它只考虑到CPU字节序是小端序的情况,没有考虑到字节序为大端序时的情况。也就是说这个程序是认系统的,对于不同的系统其结果是不一样的。对于不同的计算机系统其采用的字节序可能是不同的,因此,上述分析不完全正确。对于大端序来说,这个程序的运行结果就是输出一个字符'm'。因为将b强制转换为字符串,其值为空串。下图是在大端序的计算机上运行的结果。程序的前几行用来判断计算机的字节序,从输出结果看可知是大端序的,在看本题的输出结果是'm',与上面分析一致。

图片

类似的题目还有:

下面程序的输出结果是_____。

#include <stdio.h>
int main(void)
{union {char c;int i;   }test;test.i = 0x1234;test.c = 'A';printf("%x",test.i);return 0;  
} 

本题提供的答案是 41 ,这个一个错的答案。

在小端序的计算机上运行,结果是1234。

下图是在小端序的计算机上运行结果的截图。

图片

在大端序的计算机上运行,结果是41001234。

下图是在大端序的计算机上运行结果的截图。

图片

2. 写出下列程序的运行结果。


#include <stdio.h>
int main()
{int x=1, y=0, a;a = (x-->y+x) ? 10: 20;printf("a=%d\n",a);return 0;
}

分析:表达式x-->y+x成立,则输出a=10,否则输出a=20。因x的数值为1,子表达式x--的值为1,子表达式y+x的值也为1,因此,x-->y+x不成立,即该表达式的值为0,因此,输出结果是a=20。

这个分析也是错的。如果在Dev C++环境下编译运行这个程序,输出结果为a=10。

图片

这是为什么?这是因为表达式x-->y+x存在未定义行为。因为子表达式x--的值为1,但其自减1的发生可能在y+x之前,或之后,如果在y+x之前发生,则x--等于1,y+x等于0,x-->y+x条件成立,如果在之后发生,则x-->y+x不成立。

对于存在未定义行为的表达式,那是潜在的bug,在编写程序时一定要避免使用。

参考文献:

[1]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2023.

[2]https://pan.baidu.com/s/17ZXphwqySNIsIgcGtYMjvg?pwd=lhwc

[3]C语言基本概念——正确理解C,不要被错误的题目误导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3自定义按钮点击变颜色(切换)

实现效果图&#xff1a; 默认选中第一个按钮&#xff0c;未选中按钮为粉色&#xff0c;点击时颜色变为红色 利用动态类名&#xff0c;当定义isChange数值和下标index相同时&#xff0c;赋予act类名&#xff0c;实现变色效果 <template><view class"page"&g…

Find -name详解

Linux find命令的基本语法如下&#xff1a; find [path] [expression] path&#xff1a;要查找的目录路径。 expression&#xff1a;查找表达式&#xff0c;指定要查找的文件类型、名称、大小等条件 例子&#xff1a;find /etc -name passwd 这个表达式&#xff0c;指定条件为…

进阶Docker4:网桥模式、主机模式与自定义网络

目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的&#xff0c;每个网络上都有许多主机&#xff0c;这样便构成了一个有层次的结构。 IP 地…

【踩坑日志】SpringBoot读取nacos配置信息并提取信息中的IP地址(配置属性解析异常+排错记录)

缘起 &#xff1a;项目需读取nacos中动态的TDengine数据库连接信息并提取IP&#xff0c;一个并不复杂的操作&#xff0c;但作为一个nacos知识浅薄的菜鸡&#xff0c;我愣是捯饬了几个小时……惭愧惭愧…… 异常代码 Data Component public class TaosLink { // Value("…

ICC2:channel power plan/power switch的添加方法

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 往期文章链接: low power与pg strategy (lib cell pin connect) low power与pg strategy(pg mesh) low power与pg

深度解析Pytest插件pytest-html

在软件开发中&#xff0c;测试报告是开发者获取测试结果和问题定位的关键工具之一。然而&#xff0c;标准的控制台输出有时难以满足我们对测试报告的需求。幸运的是&#xff0c;Pytest插件 pytest-html 提供了一种简单而强大的方式&#xff0c;可以生成漂亮、可视化的HTML格式测…

Opencv小项目——手势数字刷TIKTOK

​ 写在前面&#xff1a; 很久没更新了&#xff0c;之前的实习的记录也算是烂尾了&#xff0c;但是好在自己的实习记录还是有的&#xff0c;最近也忙碌了很多&#xff0c;终于放假了&#xff0c;今天下午正好没事&#xff0c;闲来无事就随便做个小玩意吧。 思来想去&#xff…

VLAN区域间路由详解

LAN局域网 WAN 广域网 WLAN无线局域网 VLAN:虚拟局域网 交换机和路由器&#xff0c;协同工作后&#xff0c;将原来的一个广播域&#xff0c;切分为多个&#xff0c;节省硬件成本&#xff1b; 配置思路&#xff1a; 交换机上创建vlan交换机上的各个接口划分到对应的vlan中 T…

canvas绘制不同样式的五角星(图文示例)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

web蓝桥杯真题--9、水果拼盘

介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.css ├── im…

vue生命周期,父子组件生命周期

生命周期 什么是生命周期? 从Vue实例创建、运行、到销毁期间&#xff0c;总是伴随着各种各样的事件&#xff0c;这些事件&#xff0c;统称为生命周期&#xff01; beforeCreate: 初始化之前&#xff0c;data和methods的数据还没有初始化 ⻚面重定向 created&#xff1a;初始化…

【笔记】Helm-3 主题-6 Chart仓库指南

Chart仓库指南 本节介绍如何创建和使用chart仓库。在高层级中&#xff0c;chart仓库是打包的chart存储和分享的位置。 社区的Helm chart仓位于 Artifact Hub &#xff0c;欢迎加入。不过Helm也可以创建并运行您自己的chart仓库。该指南将介绍如何操作。 Artifact Hub 先决条…