C语言每日好题(3)

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

#define _CRT_SECURE_NO_WARNING
#include <stdio.h>
#include <string.h>
int main(void)
{
	if ((strlen("abc") - strlen("abcdef")) > 0)
		printf(">\n");
	else
		printf("<=\n");
	return 0;
}

先不看答案思考一下这题答案应该是多少

并且思考一下为啥?

这个地方有坑,联想一下strlen使用需要注意的方面

我们直接上答案

这个地方我们错的原因可能觉得strlen("abc")的结果是3,strlen("abcdef")的结果是6,3-6当然小于0;

首先 strlen("abc")的结果是3,strlen("abcdef")的结果是6这一步是对的

但是别忘了strlen的返回值是size_t,3和6都是size_t类型的,因此相减也是size_t类型的,size_t是无符号类型。

当然如果大家想通过printf去打印strlen("abc")-strlen("abcdef")

就不能用%d,得用%zu或者%zd

%zd是有符号打印

%zu是无符号打印

以下面题目为例子

strlen("abc")-strlen("abcdef")

的结果是-3

但是因为size-t是无符号整数

(以x86及32位为例)

原码 1000 0000 0000 0000 0000 0000 0000 0011

反码 1111 1111 1111 1111 1111 1111 1111 1100

补码1111 1111 1111 1111 1111 1111 1111 1101

但是因为是%zd打印就是将补码按照有符号格式进行解决的,会根据上面的补码推导原码

原码,所以打印是-3

但是%zu打印就是将补码按照无符号格式进行解决的,会根据上面的补码推导原码

原码,所以打印是4294967293

如下图所示

上面代码中 (strlen("abc") - strlen("abcdef")) > 0就是按照%zu这种形式进行判断的。

### 关于C语言选择练习的相关资源 对于希望提高C语言能力的学习者来说,通过做选择可以快速掌握基础知识并检验自己的理解程度。以下是关于C语言选择的一些推荐方向和相关内容: #### 资源推荐 1. **《C语言入门必刷100》系列** 这一系列包含了丰富的编程实践目[^1],虽然主要以实际编码为主,但在其中也穿插了一些理论性的选择,帮助巩固基本概念。 2. **《C C++最全每日亿》** 此系列不仅提供了大量的编程实战训练,还特别针对初学者设计了许多基础知识点的选择练习[^4]。这些目覆盖了变量、数据类型、控制结构等多个方面。 3. **字符串处理专** 目描述中提到的一个典型例子是统计字符串中的不同字符种类[^2]。这类问可以通过设置多项选项来考察学生对条件判断的理解以及逻辑思维能力。 4. **算法与程序设计教程** 结合具体实例进行讲解的文章通常会附带测试性质的小测验[^3],这对于想要全面了解某一特定主下的各种可能性非常有帮助。 #### 示例代码片段 下面给出一段简单的示例代码用于展示如何利用if-else语句完成基于条件分支的操作: ```c #include <stdio.h> int main() { int i; for (i = 1; i <= 10; ++i) { if (i % 3 != 0){ printf("%d ", i); } else{ continue; } } return 0; } ``` 该段代码展示了当`i`能够被3整除时跳过打印操作的过程。 #### 总结 为了更好地准备C语言考试或者自我评估水平,建议综合运用上述提到的各种资源来进行系统化的复习和练习。同时注意积累常见错误案例以便加深印象。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值