Инициализация цикла for с двумя переменными (java, for-loop)
Если вы хотите инициализировать несколько переменных, то они должны быть одного типа, и вам нужно использовать только одно объявление, чтобы оно выглядело следующим образом:
for (int i = 1, k = 2; i<=4000000; i++ ) {
}
Я немного написал о синтаксисе for
циклов в ответ на типы, разрешенные для объявлений переменных цикла. Это не совсем тот же вопрос, но ответ здесь имеет смысл, я тоже думаю.
В общем, вы можете посмотреть спецификацию языка Java for
оператора for
. Вы можете объявить и инициализировать любой тип переменной в цикле for
и даже объявить несколько переменных, если они все одинаковы. Соответствующие постановки в грамматике:
BasicForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement ForInit: StatementExpressionList LocalVariableDeclaration LocalVariableDeclaration: VariableModifiersopt Type VariableDeclarators VariableDeclarators: VariableDeclarator VariableDeclarators , VariableDeclarator
Это означает, что вы можете выполнить любое из следующих действий, например,
for ( ; … ; … ) // no variable declaration at all
for ( int i; … ; … ) // variable declaration with no initial value
for ( int i=0; … ; … ) // variable declaration with initial value
for ( int i=0, j=1; … ; … ) // multiple variables
for ( final Iterator<T> it = …; … ; … ) // final variable
Четвертый случай — тот, с которым вы сейчас озабочены.
В стороне, ForInit
также может быть StatementExpressionList
, что означает, что вместо объявления и инициализации переменных вы также можете просто выполнить некоторые утверждения. Например, вы можете это сделать (но это не очень полезный пример):
for ( System.out.println( "beginning loop" ; … ; … )
Не могу понять для цикла с двумя переменными
Когда я использую две переменные в цикле for с разными условиями два условия, как я использовал ниже i<3,j<2
цикл for всегда выполняется до тех пор, пока второе условие не завершится неудачей.
#include<iostream>
#include<conio.h>
using namespace std ;
int main()
{
int i,j ;
for(i=0,j=0;i<3,j<2;i++,j++)
{
cout<<"hello" ;
}
getch() ;
return 0 ;
}
В этом коде hello
печатается 2 раза. Почему?
Если я использую i<3,j<10
, то «Hello» печатается 10 раз. Я не могу понять, почему пренебрегают первым условием. Это зависит от компилятора или что-то еще?
Все работает нормально, если я заменяю условия типа | / (OR) или &&(AND).An другое дело, что я не могу инициализировать i и j в самом цикле for, это показывает мне ошибку, но работает нормально, когда я объявляю переменные в стиле C или одну переменную вне цикла for, почему это так?
Компилятор, который я использовал, — Orwell Dev C++.
Заранее спасибо.
Поделиться Источник Arun 05 октября 2013 в 05:43
3 Ответа
7
for(i=0,j=0;i<3,j<2;i++,j++)
эквивалентно
for(i=0,j=0;j<2;i++,j++)
Выражение с запятой принимает значение последнего выражения.
Какое бы условие ни было первым, оно будет проигнорировано, и будет использовано только второе.
Поделиться P0W 05 октября 2013 в 05:47
7
Цикл for
состоит из:
for(START_STATEMENT; CONDITION_EXPRESSION, LOOP_EXPRESSION) BODY_BLOCK
Где:
START_STATEMENT
— это любой отдельный оператор,который может включать в себя объявление переменной. Если вы хотите объявить 2 переменные, вы можете написатьint i=0, j=0
, но неint i=0; int j=0
, потому что последние на самом деле являются 2 операторами. Также узел, что объявление переменной является частью оператора, но не может быть частью (sub) выражения . Вот почемуint i=0, int j=0
также было бы неверно.CONDITION_EXPRESSION
— это любое одиночное выражение, которое вычисляется до логического значения. В вашем случае вы используете оператор coma , который имеет следующую семантику:A, B
будет делать:- оцените A (он будет оценивать, а не просто игнорировать)
- канава результат а
- оценка B
- вернуться Б в результате
В вашем случае:
i<3,j<2
выi<3
, вы просто игнорируете результат этого сравнения.Запятые выражения полезны, когда инструкции имеют некоторые побочные эффекты, помимо простого возврата значения. Общие случаи: переменная инкремент / декремент или оператор присваивания.
LOOP_EXPRESSION
— это любое отдельное выражение, которое не должно ни к чему приводить. Здесь вы снова используете выражение с запятой, игнорируя результат left-hand-side. Однако в этом случае вы все равно не используете результат, а просто используете побочный эффект++, который заключается в увеличении значений ваших переменных.BODY_BLOCK
— это либо отдельный оператор, либо блок, заключенный в фигурные скобки.
Вышеуказанное for
можно сравнить с:
{
START_STATEMENT;
while(EXPRESSION) {
BODY_BLOCK;
LOOP_EXPRESSION;
}
}
Поделиться CygnusX1 05 октября 2013 в 07:11
-1
c complier всегда использовал второе условие.
поэтому используется j<2.
используйте это для цикла
for(i=0,j=0;j<10;i++,j++)
Поделиться Dev 05 октября 2013 в 05:51
Похожие вопросы:
Python: C для цикла с двумя переменными
Я новичок в python. Есть ли аналогичный способ написать этот C для цикла с 2 переменными в python? for (i = 0, j = 20; i != j; i++, j—) { … }
для контура с двумя переменными условия
Сегодня на экзамене я получил вопрос о цикле for с двумя переменными (вопрос ниже ) почему вывод кода имеет одну строку, когда я даю два оператора System.out.println. цикл открытого класса { public…
Vue.js: v-для итерации с двумя переменными
Не могу понять сводку регрессии с фиктивными переменными
Поэтому я просто запустил линейную модель, которая в основном regrex5 = lm(children ~ age + educ + electric + usemeth + educ*usemeth) В которой eletric и usemeth являются фиктивными переменными….
Точечная диаграмма с двумя категориальными переменными и двумя количественными переменными
У меня есть проблема с созданием точечного рисунка. У меня есть фрейм данных distribution_tab с 4 столбцами и 6 строками. Два первых столбца являются количественными переменными, а два…
Решение системы с двумя уравнениями и двумя переменными в цикле for
Я хотел бы решить систему с двумя уравнениями и двумя переменными. Tau(i) и Roh(i) -входные массивы. Tau=[0.91411 0.91433 0.91389 0.91399 0.91511 0.915] Roh=[0.07941 0.07942 0.07952 0.07946 0.07951…
Определите повторение с двумя переменными
Меня попросили определить и решить повторение T (n), а также представить его в нотации Big-O, но я запутался с двумя переменными. Я думаю, что я имею дело с f(m,n) = 1 + f(m+1,n-3) для n>1 , и…
Использование grep с двумя переменными
Я хочу использовать grep с двумя переменными в скрипте shell var = match cat list.txt | while read word_from_list; do grep $word_from_list $var >> words_found.txt done Но grep ожидает получить…
Для цикла с двумя переменными в TCL
Я хочу преобразовать следующий код c в TCL. int a[10],b[10]; int n=20 for (i=1,j=1; i<=n; i+=2,j++) { b[j]=a[i]; } Мне нужно изменить этот цикл на TCL, я не хочу использовать функцию foreach в…
Можно ли использовать новый цикл for в Java с двумя переменными?
Мы можем использовать старый цикл for ( for(i = 0, j = 0; i<30; i++,j++) ) с двумя переменными Можно ли использовать цикл for-each (или расширенный цикл for) В java ( for(Item item : items) с…
Инициализация цикла for с 2 переменными
Я действительно не понимаю, почему это не сработает…
for (int i = 1, int k = 2; i<=4000000; i++) {
}
Пока это будет…
for (int i = 1; i<=4000000; i++) {
}
Мне нужно инициализировать две переменные, но когда я попробую первый код, он не будет компилироваться, код выглядит правильно??
java for-loopПоделиться Источник Jerry Murphy 08 февраля 2014 в 14:18
4 Ответов
3
Если вы хотите инициализировать несколько переменных, то они должны быть одного типа, и вы должны использовать только одно объявление, так что это будет выглядеть так:
for (int i = 1, k = 2; i<=4000000; i++ ) {
}
Я немного написал о синтаксисе for
циклов в ответ на типы, разрешенные в объявлениях переменных цикла? Это не совсем тот же вопрос, но ответ имеет смысл и здесь, я думаю.
В общем, вы можете взглянуть на спецификацию языка Java для оператора for
. Вы можете объявить и инициализировать любой тип переменной в цикле for
, и даже можете объявить несколько переменных, если они все одного типа. Соответствующие производства в grammar являются:
BasicForStatement:
for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement
ForInit:
StatementExpressionList
LocalVariableDeclaration
LocalVariableDeclaration:
VariableModifiersopt Type VariableDeclarators
VariableDeclarators:
VariableDeclarator
VariableDeclarators , VariableDeclarator
Это означает, что вы можете выполнить любое из следующих действий, например,
for ( ; … ; … ) // no variable declaration at all for ( int i; … ; … ) // variable declaration with no initial value for ( int i=0; … ; … ) // variable declaration with initial value for ( int i=0, j=1; … ; … ) // multiple variables for ( final Iterator<T> it = …; … ; … ) // final variable
Четвертый случай-это тот, которым вы занимаетесь в данный момент.
В стороне, ForInit
также может быть StatementExpressionList
, что означает, что вместо объявления и инициализации переменных вы также можете просто выполнить некоторые операторы. E.g, вы могли бы сделать это (но это не особенно полезный пример):
for ( System.out.println( "beginning loop" ; … ; … )
Поделиться Joshua Taylor 08 февраля 2014 в 14:20
1
Изменить как for (int i = 1, k = 2; i<=4000000; i++) {
От Дока
Общая форма утверждения for может быть выражена следующим образом:
for (initialization; termination; increment) {
statement(s)
}
- Выражение инициализации инициализирует цикл; он выполняется один раз, как цикл начинается.
- Когда выражение завершения принимает значение false, цикл прекращает.
- Выражение инкремента вызывается после каждой итерации через цикл; вполне допустимо, чтобы это выражение увеличивалось или уменьшите значение.
Вы можете инициализировать как int i=1,k=2;
Поделиться Rakesh KR 08 февраля 2014 в 14:21
0
for (int i = 1, k = 2; i<=4000000; i++) {
Поделиться Sabuj Hassan 08 февраля 2014 в 14:20
-1
2 последовательных инициализации должны быть разделены точкой с запятой, как
int a; int b;
В приведенном выше случае вы разделили их с помощью запятой, и поэтому это дает ошибку компиляции.
С уважением.
Поделиться Gautam 28 января 2018 в 10:07
Python: C для цикла с двумя переменными
Я новичок в python. Есть ли аналогичный способ написать этот C для цикла с 2 переменными в python? for (i = 0, j = 20; i != j; i++, j—) { … }
Инициализация цикла for corrupts вне его области применения
В одном из моих объявлений метода класса, в котором я работаю с циклами и массивами, я получаю особенно странную ошибку. Похоже, что инициализация цикла моего предыдущего цикла влияет на результаты…
Инициализация переменных внутри цикла for
У меня есть цикл for, и я инициализирую переменные внутри этого цикла. После этого мне нужно манипулировать этими переменными, но компилятор говорит, что переменные не инициализируются . public…
OpenMP-Несколько Переменных Цикла
Работают ли циклы OpenMP ‘For’ с несколькими переменными цикла? Например: int i; double k; #pragma omp parallel for for (k = 0, i = 0; k < 1; k += 0.1, i++) { } Он отлично работает без OpenMP, но…
Инициализация двумерных массивов JPanel с помощью цикла for
Я относительно новичок в java, и я пытаюсь выполнить задание для школы. В моем задании я должен сделать программу GUI, которая делает красную и черную шахматную доску 8 на 8. Единственная проблема…
Для цикла с 2 переменными итератора
Мне нужно перебрать цикл FOR с 2 переменными. Я искал что-то вроде этого: DECLARE counter INT; max INT; … FOR counter IN REVERSE 1..10, max IN 1..5 LOOP — some code END LOOP; но не смог найти…
Для цикла с несколькими переменными
Возможно ли для цикла for с 2 переменными остановить инкрементирование только одной переменной при выполнении условия ? Например for(int i = 0, j = 0; i < 5 && j < 10; i++, j++) { cout…
Вычисления внутри цикла for с переменными, отличающимися только последним номером индекса их имени, в R
У меня есть следующий код. Я хочу назначить переменным i1 , i2 , i3 , i4 определенные вычисления , которые необходимо выполнить с переменными m1 , m2 , m3 , m4 . Поэтому вместо того, чтобы делать…
Как утешить 2 PHP ‘for’ петель?
Возможный Дубликат : Php для цикла с 2 переменными? Есть ли способ сделать его короче: for ($x = 1; $x <= 5; $x++) { for ($y = 1; $y <= 5; $y++) { echo $x, ‘ ‘, $y, ‘<br>’; } } 2 для…
Как написать цикл for с 2 переменными в bash?
Я отсортировал вывод из конфликтующих чисел, которые уже существуют в моем DB с новым запросом вставки в вывод имени файла. Это выходные данные файла. cat output DataBase: (9999999999) NewDB_insert:…
«для цикла» с двумя переменными? (python, for-loop)
Если вам нужен эффект вложенного цикла, используйте:
import itertools
for i, j in itertools.product(range(x), range(y)):
# Stuff...
Если вы хотите просто выполнить цикл одновременно, используйте:
for i, j in zip(range(x), range(y)):
# Stuff...
Обратите внимание, что если x
и y
не имеют одинаковой длины, zip
будет усекаться до кратчайшего. Как отметил @abarnert, если вы не хотите усекать до кратчайшего списка, вы можете использовать itertools.zip_longest
.
UPDATE
На основе запроса «функция, которая будет читать списки» t1 «и» t2 «и возвращает все идентичные элементы», я не думаю, что OP хочет zip
или product
. Я думаю, что они хотят set
:
def equal_elements(t1, t2):
return list(set(t1).intersection(set(t2)))
# You could also do
# return list(set(t1) & set(t2))
Метод intersection
для set
вернет все общие для него элементы и другой набор (обратите внимание, что если ваши списки содержат другие list
s, вам может потребоваться преобразовать внутренний list
в tuples
сначала, чтобы они были хешируемыми, в противном случае вызов set
завершится ошибкой.). Функция list
затем возвращает набор в список.
ОБНОВЛЕНИЕ 2
ИЛИ, OP может хотеть элементы, которые идентичны в одной и той же позиции в списках. В этом случае наиболее подходящим будет zip
, а тот факт, что он обрезается до кратчайшего списка, — это то, что вы хотели бы (так как невозможно, чтобы один и тот же элемент был в индексе 9, когда один из списков был всего 5 элементы длинные). Если это то, что вы хотите, перейдите к следующему:
def equal_elements(t1, t2):
return [x for x, y in zip(t1, t2) if x == y]
Это вернет список, содержащий только те элементы, которые являются одинаковыми и находятся в одной и той же позиции в списках.
«для цикла» с двумя переменными?
Если вы хотите получить эффект вложенного цикла for, используйте:
import itertools
for i, j in itertools.product(range(x), range(y)):
# Stuff...
Если вы просто хотите сделать цикл одновременно, используйте:
for i, j in zip(range(x), range(y)):
# Stuff...
Обратите внимание, что если x
и y
не имеют одинаковой длины, то zip
будет усечен до самого короткого списка. Как указал @abarnert, если вы не хотите сокращать список до самого короткого, вы можете использовать itertools.zip_longest
.
UPDATE
Основываясь на запросе «функции, которая будет читать списки «t1» и «t2″ и возвращать все идентичные элементы», я не думаю, что OP хочет zip
или product
. Я думаю, что они хотят set
:
def equal_elements(t1, t2):
return list(set(t1).intersection(set(t2)))
# You could also do
# return list(set(t1) & set(t2))
Метод intersection
a set
вернет все элементы, общие для него и другого набора (Обратите внимание, что если ваши списки содержат другие list
s, Вы можете сначала преобразовать внутренние list
s в tuples
, чтобы они были хэшируемыми; в противном случае вызов set
завершится неудачей.). Затем функция list
превращает набор обратно в список.
UPDATE 2
OR, OP могут потребоваться элементы, которые идентичны в одной и той же позиции в списках . В этом случае наиболее подходящим будет zip
, и тот факт, что он усекается до самого короткого списка, — это то, что вам нужно (поскольку невозможно, чтобы один и тот же элемент был в индексе 9, когда один из списков имеет только 5 элементов в длину). Если это то, что вы хотите, идите с этим:
def equal_elements(t1, t2):
return [x for x, y in zip(t1, t2) if x == y]
Это вернет список, содержащий только те элементы, которые являются одинаковыми и находятся в одной позиции в списках.