2016-11-21 2 views
0

Возможно ли, чтобы цикл for с двумя переменными останавливал приращение только одной переменной при выполнении условия? НапримерДля цикла с несколькими переменными

for(int i = 0, j = 0; i < 5 && j < 10; i++, j++) 
{ 
    cout << i << " " << j << endl; 
} 

и вывод будет выглядеть примерно так

0 0 
1 1 
2 2 
3 3 
4 4 
4 5 
4 6 
4 7 
4 8 
4 9 

Это мой фактический код. Я хотел условие для обеих переменных

cout << sp.dets.size() << " " << gt.groundtruth.size() << endl; 
for (int i = 0, j = 0; i < sp.dets.size() && j < gt.groundtruth.size(); j < gt.groundtruth.size() ? j++ : j, i < sp.dets.size() ? i++ : i) 
{ 
    cout << i << " " << j << endl; 
} 

sp.dets.size = 0

gt.groundtruth.size() = 8

Было бы хорошо, если решение работает для любого числа т.е. i > j or i < j or i = 0 or j = 0

+0

Я думаю, что это C++ – abdul

+0

Выражение «i <5 && j <10; i ++, j ++» противоречит логической природе этого. – aquila

+0

@abdul, вы можете определить переменные внутренние условия цикла в c99. – StoryTeller

ответ

1

Вы можете использовать тернарный оператор для увеличения переменной i. Как показано ниже:

for(int i = 0, j = 0; i < 5 && j < 10; j++, i<4? i++: i) 
{ 
    cout << i << " " << j << endl; 
} 

Это приведет к ожидаемому результату.

+0

Спасибо! Что, если бы я хотел условие для обеих переменных? Я редактировал мой код выше, чтобы показать другой пример. Кажется, что не работает – kong

+1

'' i <5' часть условия 'for' может быть удалена, потому что' i' никогда не может превышать 4 –

+0

@ karsten: да, в этом нет необходимости. @kong: Я думаю, вы должны сравнить его с декрементированным значением 'j falloutcoder

0

Нечто подобное может работать,

int k = 0; 
int val = 4; 
for(int i = 0, j = 0; i < 10 && j < 10; i++, j++){ 
if (i>=val){ 
    k=val; 
    cout << k << " "<< j << endl; 
} 
else 
cout << i << " " << j << endl; 
} 

печать это,

0 0 
1 1 
2 2 
3 3 
4 4 
4 5 
4 6 
4 7 
4 8 
4 9 
0

Вы можете использовать тройной оператор по обеим переменным. Просто убедитесь, чтобы изменить свое состояние, чтобы сломать только когда оба достигают своего значения, отправленную

for (int i = 0, j = 0; 
    i != 5 || j != 10;) 
{ 
    i += i < 5 ? 1 : 0; 
    j += j < 10 ? 1 : 0; 
} 

Вы заметите, что я переехал приращение в теле цикла, это улучшает читаемость, на мой взгляд.

0

Не пытайтесь быть слишком умным, пытаясь поместить всю логику в одну строку. Не более важно, чтобы ваш код мог быть прочитан другими (и вы сами через две недели), чем сохранение одной строки. Если приращением логика двух переменных является более сложным, чем просто увеличивается на единицу для каждого цикла, положить их в отдельно линии, как это:

while (i<5 && j<10) { 
    ... 
    // complicated expression calculating new i 
    // complicated expression calculating new j 
} 

В вашем случае, вы можете также перевернуть логику вокруг:

Смежные вопросы