#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语句。

10-08 08:08