减少for循环中的2个变量?

时间:2012-08-17 18:41:23

标签: c++ visual-studio mfc

我不确定是否有办法可以做到这一点。我的作业是这么说的,但我很确定没有这样的方式:

    CStringArray m_Last;
    int size = m_Last.GetCount();

    // In the .h file I have,

     #define IDM_LAST 90// these are to be used for contiguous Resource ID's
     const int MAXLAST = 5; // there are 5 Resource IDs

    for(int i = 0, j = IDM_LAST; i < size, j < IDM_LAST + MAXLASTUSEDDEST; ; i++, j++)
    {
        menuAPopup.AppendMenu(MF_STRING, j, m_Last.ElementAt(i));
    }

我有一种方法可以使用1个变量作为for循环,ij

3 个答案:

答案 0 :(得分:4)

问题在于:

i < size, j < IDM_LAST + MAXLASTUSEDDEST

您需要将条件中的,更改为&&


简而言之,for的工作原理如下:

for (X; Y; Z)
{
    ...
}

转换为:

X;
while (Y)
{
    ...
    Z;
}

X中定义的变量外,while范围内的变量。

由于以下是有效的C代码:

int i = 0, j = IDM_LAST;
while (i < size && j < IDM_LAST + MAXLASTUSEDDEST)
{
    menuAPopup.AppendMenu(MF_STRING, j, m_Last.ElementAt(i));
    i++, j++;
}

然后此for也有效:

for(int i = 0, j = IDM_LAST; i < size && j < IDM_LAST + MAXLASTUSEDDEST; i++, j++)
{
    menuAPopup.AppendMenu(MF_STRING, j, m_Last.ElementAt(i));
}

您不一定需要减少变量的数量,但如果您坚持,请按照以下方式进行操作。

如果仔细观察,您会发现j始终等于i + IDM_LAST。因此,您可以使用以下内容替换for

for(int i = 0; i < size && i + IDM_LAST < IDM_LAST + MAXLASTUSEDDEST; i++)
{
    menuAPopup.AppendMenu(MF_STRING, i + IDM_LAST, m_Last.ElementAt(i));
}

简化:

for(int i = 0; i < size && i < MAXLASTUSEDDEST; i++)
{
    menuAPopup.AppendMenu(MF_STRING, i + IDM_LAST, m_Last.ElementAt(i));
}

答案 1 :(得分:2)

您有2个终止条件:i < sizej < IDM_LAST + MAXLASTUSEDDEST。现在:您如何根据i < size重写j?一旦你有了这个,你应该能够以i的方式同样替换循环体中的j

请注意,ij在每次迭代时总是递增1。由于您的初始化,这意味着在每次迭代中:j == (i + IDM_LAST)都是真的。

现在至于给定的循环,它是不正确的:你在终止条件中使用逗号运算符,这将无法执行您想要的操作:i < size的结果将被忽略!将循环更改为:

int i, j;
for (i = 0, j = IDM_LAST; (i < size) && (j < IDM_LAST + MAXLASTUSEDDEST); i++, j++)

答案 2 :(得分:0)

 CStringArray m_Last;
 int size = m_Last.GetCount();

 // In the .h file I have,

 // last of the contiguous Resource block ID's
 #define IDM_LAST 90
 // there are 5 Resource IDs only
 const int MAXLAST = 5;

 for (int i=0 ; (i<size)&&(i<MAXLAST) ; i++)
 {
    menuAPopup.AppendMenu(MF_STRING, (IDM_LAST - i), m_Last.ElementAt(i));
 }