#include <stdio.h>
int main (int argc, const char * argv[])
{
static struct item
{
char code;
float price;
}
table[] =
{
{'a', 3.29},
{'b', 2.99},
{'c', 0.59},
{'d', 1.59},
{'e', 2.39}
};
char item_code[2];
int quantity;
int i;
do {
printf("Enter item code: ");
scanf("%1s", item_code);
if (*item_code != '.') {
for (i=0; i< sizeof(table)/sizeof(struct item)
&& table[i].code != *item_code; i++);
if (i < sizeof(table)/sizeof(struct item)) {
printf("Enter quantity: ");
scanf("%d", &quantity);
printf("\nUnit price = %.2f, total price = %.2f.\n\n\n",
table[i].price, quantity * table[i].price);
}
else
printf("\nItem code %c does not exist. \n\n\n", *item_code);
}
} while (*item_code != '.');
printf("Thank you.\n");
return 0;
}
我是新手。我无法理解上述程序中的第二个“ for循环”。为什么要使用sizeof?每次执行循环时,“ i”的值到底是多少?
谢谢。
最佳答案
让我们检查一个整数为四个字节的系统中的一些简单代码:
int xyzzy[] = {3,1,4,1,5,9,2,6,5,3,5,8,9}; // 13 integers
printf ("%d\n"", sizeof(xyzzy)); // 13 * 4 = 52
printf ("%d\n"", sizeof(int)); // 4
printf ("%d\n"", sizeof(xyzzy) / sizeof(int)); // 52 / 4 = 13
根据最后一行,该计算是一种获取数组中项目数的方法。
顺便说一句,我更喜欢这种构造:
sizeof(xyzzy) / sizeof(*xyzzy)
因为即使我将
xyzzy
的类型更改为double
,这也将继续有效。这意味着我只需要更改声明变量的那一行,而不用搜寻所有大小的计算。实际上,我什至有一个最喜欢的宏:
#define numof(x) (sizeof(x) / sizeof(*x))
使我的代码小一点。
就
for
循环的确切功能而言(顺便说一句,从技术上讲,它不是第二个for
循环,因为只有一个循环,但这是第二个循环),它基本上遍历了(从第一个索引的0开始凝视),直到到达最后一个元素之外的位置,或者找到具有所需物料代码的元素。在退出该循环时,如果找不到商品代码,则将
i
设置为元素数,如果找到商品代码,则将其设置为正确的索引,因此该i
循环后的if
语句。