我不确定是否有办法可以做到这一点。我的作业是这么说的,但我很确定没有这样的方式:
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循环,i
或j
?
答案 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 < size
和j < 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++)
答案 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));
}