for循环测试题的小错误

问题描述
在“C技能树/运算符与表达式/逗号运算符与表达式”章节学习时,简单的测试考题竟然做错了😓。一方面对自己的失误感到羞愧,编写、阅读程序时应当仔细谨慎,明了每一步骤。另一方面感叹尽管使用C语言已经不少时间了,但细微之处还有很多不足,C语言真是学无止境。特此记录,以示警醒,题目描述如下:

//打印邮费价格表,输出20kg以内物品的邮费价格表,邮费计算规则如下所示:
//* 1kg以内6元。
//* 超过1kg,每增加1kg加收2元。
//请选出正确的for循环头部,实现上述功能。

#include <stdio.h>
#define FIRST_COST 6
#define NEXT_COST 2

int main(int argc, char** argv)
{
    int weight, cost;

    printf("重量\t价格\n");
    for (_____(1)_____)
        printf("%d\t¥%d\n", weight, cost);

    return 0;
}

在这两个选项中做错了:

//正确答案:
weight = 1, cost = FIRST_COST; weight <= 10; ++weight, cost = FIRST_COST + (weight - 1) * NEXT_COST
//错误答案:
weight = 1, cost = FIRST_COST; weight <= 10; cost = FIRST_COST + (weight - 1) * NEXT_COST, ++weight

正确答案运行如下:
在这里插入图片描述
错误答案则是:
在这里插入图片描述

反省查错
很明显的看到因为对循环中自增运算理解偏差导致选择了错误选项,下意识的觉得++weight会影响到printf,先自增岂不是初始就变为2?其实循环体中自增运算均是在本次循环的最后进行操作,很简单的问题,竟然一时糊涂选择错误(lll¬ω¬),即正确答案等同于:

for (weight = 1, cost = FIRST_COST; weight <= 10;)
{
	printf("%d\t¥%d\n", weight, cost);

	++weight;
	cost = FIRST_COST + (weight - 1) * NEXT_COST;
}

错误答案则为:

for (weight = 1, cost = FIRST_COST; weight <= 10;)
{
	printf("%d\t¥%d\n", weight, cost);

	cost = FIRST_COST + (weight - 1) * NEXT_COST;
	++weight;
}

这样就清晰的看出正确选项了。
这样写还涉及一些逗号运算符的内容,可参考这一章节的学习内容:
【C语言】逗号运算符详解:

推想
由此而推想到在本例中,因为循环内容中并未对weight进行除自增以外的操作,所以在其他条件不变的情况下,++weight与weight++效果相同:

for (weight = 1, cost = FIRST_COST; weight <= 10; weight++, cost = FIRST_COST + (weight - 1) * NEXT_COST)
	printf("%d\t¥%d\n", weight, cost);

在这里插入图片描述

for (weight = 1, cost = FIRST_COST; weight <= 10;)
{
	printf("%d\t¥%d\n", weight, cost);

	++weight;//因为此处不论++在前在后都等效于weight += 1
	cost = FIRST_COST + (weight - 1) * NEXT_COST;
}

但在用weight去赋值的情况下,两种写法效果不一样:

	for(weight = 1; weight < 10;)
	{
		cost = ++weight;
		//等效于:
		//weight += 1;
		//cost = weight;
		printf("%d,%d\r\n",cost,weight);
	}

在这里插入图片描述

	for(weight = 1; weight < 10;)
	{
		cost = weight++;
		//等效于:
		//cost = weight;
		//weight += 1;
		printf("%d,%d\r\n",cost,weight);
	}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cedar_king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值