问题描述
在“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);
}