0

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

    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));
    }

这里有一种方法可以让 for 循环使用 1 个变量,i或者j

4

3 回答 3

4

问题在这里:

i < size, j < IDM_LAST + MAXLASTUSEDDEST

您需要将,in 条件更改为&&.


简而言之,这是如何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));
}
于 2012-08-17T18:44:12.363 回答
2

您有 2 个终止条件:i < sizej < IDM_LAST + MAXLASTUSEDDEST. i < size现在:你将如何重写j?一旦你得到了它,你应该能够i在循环体中以类似的方式替换j.

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

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

int i, j;
for (i = 0, j = IDM_LAST; (i < size) && (j < IDM_LAST + MAXLASTUSEDDEST); i++, j++)
于 2012-08-17T18:44:21.057 回答
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));
 }
于 2012-08-19T00:08:00.813 回答