Логический оператор И

Меня немного смущает логический оператор AND. У меня есть эти 2 строки кода. Здесь num и j оба являются целыми. У меня есть ситуация, когда выполняются оба условия, но я не знаю, почему не печатается значение j. Кто-нибудь может указать на ошибки? Заранее спасибо.

if(k==1 && num%j==0)
    printf("%d",j);

person narayanpatra    schedule 16.08.2010    source источник
comment
Ну, не могли бы вы рассказать нам об этой ситуации? :)   -  person fresskoma    schedule 16.08.2010
comment
Одна строка кода не помогает решить проблему. Вы должны лучше описать проблему.   -  person dierre    schedule 16.08.2010
comment
Чтобы отладить эту проблему, напечатайте значения k, j, num и, возможно, даже num%j ПЕРЕД оператором условия, чтобы увидеть, какими они ДЕЙСТВИТЕЛЬНО являются. Затем проведите оценку вручную с помощью карандаша и бумаги, если вы все еще застряли.   -  person FrustratedWithFormsDesigner    schedule 16.08.2010
comment
Каковы значения ваших переменных, при которых, по вашему мнению, результат должен быть верным, а какой нет?   -  person Russ    schedule 16.08.2010
comment
извините всех; Это была моя крайняя глупость. Я понял ошибку.   -  person narayanpatra    schedule 16.08.2010
comment
@ user417552: Поскольку проблема решена, либо примите ответ, либо удалите вопрос. :)   -  person Justin Ardini    schedule 16.08.2010
comment
@ user417552: Кроме того, наше любопытство возбуждено, и мы хотели бы знать, в чем была ошибка - значения не соответствуют вашим ожиданиям или вывод каким-то образом проглатывается.   -  person David Thornley    schedule 16.08.2010
comment
Мой код был абсолютно правильным. Я использовал неправильные входные данные, чтобы проверить это. Прошу прощения у всех за свою невнимательность.   -  person narayanpatra    schedule 16.08.2010


Ответы (6)


На простом английском языке выражение k == 1 && num % j == 0 истинно тогда и только тогда, когда k равно 1 и остаток от деления num на j равен 0. Больше я не могу сказать.

person Justin Ardini    schedule 16.08.2010

Здесь есть две возможности. Либо вы никогда не доберетесь до printf, либо результат никогда не дойдет до вас.

В первом случае вы уверены, что k == 1 и num % j == 0? Предоставление нам фактических значений числовых значений в вашем тесте может помочь. Обратите внимание, что если k является числом с плавающей запятой, которое является результатом вычисления, оно может незначительно отличаться от 1,0, и условие вернет false.

Что касается второго случая, как вы это проверяете? Это должно распечатать значение j, но оно не сбрасывает вывод, поэтому, если программа аварийно завершится или консоль исчезнет в конце программы, или что-то еще, вы можете этого не увидеть. Попробуйте printf("%d\n", j); или даже fflush(stdout);, чтобы убедиться, что вывод виден на вашей консоли или терминале.

person David Thornley    schedule 16.08.2010

Если условия верны, в вашем коде нет проблем.

Проверьте вывод здесь.

person Praveen S    schedule 16.08.2010

вы также можете добавить оператор else. Я не могу сосчитать, сколько раз это случалось со мной. это хорошая практика, по крайней мере, на начальных этапах написания кода. сделай это:

это поможет вам поймать проблему

if(k==1 && num%j==0)
    printf("%d",j);
else {
   printf("%d \n",k);
   printf("%d \n",num);
   printf("%d \n",j);
   printf("%d \n",(num%j));
} 
person jramirez    schedule 16.08.2010

Ваш код работает нормально, взгляните на этот тестовый пример:

http://ideone.com/1gz8R

Так что проблема не в этих двух строчках. Попробуйте вывести три задействованных значения прямо перед тем, как попасть в эти строки, вы можете быть удивлены тем, что увидите (или не увидите).

person Vasiliy Sharapov    schedule 16.08.2010

Вы также должны привыкнуть свободно использовать круглые скобки, imo:

if(k == 1 && (num % j == 0))

как минимум.

person Jonathan    schedule 16.08.2010
comment
Блех! На мой взгляд, лишние скобки мешают удобочитаемости и предполагают, что автор не был уверен, как работает язык, который он использует. - person P Daddy; 17.08.2010
comment
Хотя это субъективно, я думаю, что такие круглые скобки могут только улучшить читаемость, когда может быть двусмысленность в порядке операций. - person Jonathan; 17.08.2010
comment
Да, конечно субъективно, но то, что вышеописанные операторы вообще можно было считать неоднозначными, говорит мне о грубой незнакомости. Понятно, что можно забыть о правилах приоритета для менее используемых (или, по крайней мере, реже смешанных) операторов, таких как <<, &, ^, ?: и др., но нет оправдания тому, что вы не запоминаете простые, такие как ваш пример. Они довольно интуитивно понятны. Логические операторы (&&, ||) имеют более низкий приоритет (&& — более высокий из двух), чем сравнения (==, < и т. д.), которые ниже, чем арифметические операторы, которые следуют обычным математическим правилам. - person P Daddy; 17.08.2010
comment
Но что касается помощи удобочитаемости, быстро, что здесь происходит? if(((a + (2 * b)) < (foo() - bar())) || (((foo() < bar()) && (a < b)))) ifTrue(); else ifFalse(); Суп в скобках! Фу. Простой глаз не может уследить за этим. Сравните с if(a + 2 * b < foo() - bar() || foo() < bar() && a < b) ifTrue(); else ifFalse();. Зная простые правила приоритета, которые я изложил ранее, за этим легко следовать (хотя, возможно, не так много в этом поле для комментариев). - person P Daddy; 17.08.2010