PDA

View Full Version : سوال: فرق && با & وفرق | با ||



motherboard
شنبه 01 شهریور 1393, 15:41 عصر
سلام.من فرق & با && و فرق | با || رو هنوز متوجه نشدم.یکی برام توضیح بده.

مسعود اقدسی فام
شنبه 01 شهریور 1393, 15:48 عصر
عملگرهای && و || معادل عملگر AND‌ و OR‌ منطق ریاضی هستن. یعنی برای عبارت‌های درست و نادرست استفاده می‌شن. مثل:

if( a == 0 || y == 0)


اما & و | برای AND و OR بیتی هستن. مثل:


int y = 1, x = 3;
int z = x & y;


که مقدار z برابر 2 می‌شه (عملگر AND بیتی و یک بودن بیت دوم هر دو متغیر x و y).

omid_kma
شنبه 01 شهریور 1393, 16:01 عصر
عملگر && و || بر روی 2 عدد یا 2 شی استفاده میشه . کار کردشون از اسمشون مشخصه .
عملگر های | و & برای انواع عددی مثل int ,... بر روی بیت ها انجام میشن . این لینک رو ببینید http://www.7khatcode.com/37/%D8%B9%D9%85%D9%84%DA%AF%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A8%DB%8C%D8%AA%DB%8C-c-%DA%86%DB%8C-%D9%87%D8%B3%D8%AA%D9%86-%D8%9F?show=37#q37
نکته ای هم که هست شما میتونید همه این عملگر ها رو برای کلاستون هم overload کنید و معنی جدیدی بهش بدید . یکی از جاهایی که استفاده شده مثلا کلاس QFlags در Qt هستش که داخلش عملگر | رو overload کردن یا خود cin , cout که عملگر های shift براشون overload شده .
مثلا

#include<iostream>


class A{
public:
bool operator&&(const A& other){std::cout<<1; return true;}
bool operator|(const A& other){std::cout<<2; return true;}
bool operator|(const int& other){std::cout<<3; return true;}
};
int main ()
{
A a;
A b;
a&&b;
a|b;
a|5;
}

Coder#
یک شنبه 02 شهریور 1393, 05:46 صبح
&& و || دو عملگر منطقی هستن.
& و | دو عملگر بیتی (Bitwise) هستن; این ها عملیاتشون رو بر روی بیت(ها) انجام میدن.

&&: هردو شرطی که در سمت چپ و راست این عملگر قرار می گیرن، می بایست 'درست' باشن تا دستور/دستورات داخل شکم if اجرا بشه/بشن.
||: در صورت 'درست' بودن یکی از دو شرطی که در سمت چپ و راست این عملگر قرار گرفتن، دستور/دستورات داخل شکم if اجرا میشه/میشن.



#include <stdio.h>
int main ()
{
int c, x;
while ((c = getchar()) != EOF)
{
if (c >= '0' && c <= '9')
{
putchar('#');
x = !0;
}
else if (c == '\n' && x != 0)
putchar('\n');
else if (c == '/' || c == '\\' || c == '.' || c == '!')
return 0;
else
x = 0;
}
}


عملگر & (AND) عملیات خودش رو بر روی دو عملوند یا عدد باینری انجام میده.
مثال:
n = 10
m = 9
عدد دهگان 10 به باینری میشه 1010، و عدد دهگان 9 به باینری میشه 1001.
بنابراین n = 1010 و m = 1001.
نتیجه عملی که عملگر & می تونه روی این دو عملوند انجام بده، به شکل زیره:
اگر دو عملوند مورد نظر هردو 1 باشن، نتیجه 1 میشه، در غیر این صورت، نتیجه 0 میشه.
&



0

1
0

1

n



1

0

0

1

m



0

0

0

1

=




عملگر | (OR) همچنان عملیات خودش رو بر روی دو عملوند یا عدد باینری انجام میده.
نتیجه عملی که عملگر & می تونه روی این دو عملوند انجام بده، به شکل زیره:
اگر دو عملوند مورد نظر هردو 0 باشن، نتیجه 0 میشه، در غیر این صورت، نتیجه 1 میشه.

|


0

1

0

1

n



1

0

0

1

m



1

1

0

1

=










#include <stdio.h>
int main ()
{
int n = 10, m = 9;
printf ("%i = %i\n", n, dec2bin(n));
printf ("%i = %i\n\n", m, dec2bin(m));
printf ("%i = %i\n", n & m, dec2bin(n & m));
printf ("%i = %i\n", n | m, dec2bin(n | m));
return 0;
}

/* Decimal to Binary converter */
int dec2bin (int d)
{
int i, b = 0;
for (i = 1; d > 0; d /= 2, i *= 10)
b += d % 2 * i;
return b;
}

motherboard
یک شنبه 02 شهریور 1393, 10:57 صبح
جناب Coder# (http://barnamenevis.org/member.php?337225-Coder) حواستون نبود و تابع dec2bin رو معرفی نکرده بودید.

#include <stdio.h>
int dec2bin(int);
int main ()
{
int n = 10, m = 9;
printf ("%i = %i\n", n, dec2bin(n));
printf ("%i = %i\n\n", m, dec2bin(m));
printf ("%i = %i\n", n & m, dec2bin(n & m));
printf ("%i = %i\n", n | m, dec2bin(n | m));
return 0;
}

/* Decimal to Binary converter */
int dec2bin (int d)
{
int i, b = 0;
for (i = 1; d > 0; d /= 2, i *= 10)
b += d % 2 * i;
return b;
}

ciavosh
یک شنبه 02 شهریور 1393, 12:03 عصر
اصلاً چه ارتباطی با هم دارند؟

Coder#
یک شنبه 02 شهریور 1393, 22:01 عصر
جناب Coder# (http://barnamenevis.org/member.php?337225-Coder) حواستون نبود و تابع dec2bin رو معرفی نکرده بودید.
لازم نبود.

Coder#
یک شنبه 02 شهریور 1393, 22:08 عصر
اصلاً چه ارتباطی با هم دارند؟

عملگرهای منطقی ارتباطی با عملگرهای بیتی ندارن.

motherboard
یک شنبه 02 شهریور 1393, 22:20 عصر
لازم نبود.
اطمینان دارید؟؟؟؟
اخه من تا وقتی که کد شما رو عینا خوستم کامپایل کنم ایراد می گرفت ولی وقتی اومدم قبل از تابع اصلی برنامه اون عبارت رو اضافه کردم و اینکه باید اضافه می شد کد به درستی اجرا شد.:چشمک:

Coder#
یک شنبه 02 شهریور 1393, 22:35 عصر
اطمینان دارید؟؟؟؟
اخه من تا وقتی که کد شما رو عینا خوستم کامپایل کنم ایراد می گرفت ولی وقتی اومدم قبل از تابع اصلی برنامه اون عبارت رو اضافه کردم و اینکه باید اضافه می شد کد به درستی اجرا شد.:چشمک:

دلیلش اینه که تو در ++Dev C (که مطمئنم از اون استفاده می کنی) برنامه رو با پسوند Cpp کامپایل و ذخیره کردی.

motherboard
دوشنبه 03 شهریور 1393, 00:41 صبح
دلیلش اینه که تو در ++Dev C (که مطمئنم از اون استفاده می کنی) برنامه رو با پسوند Cpp کامپایل و ذخیره کردی.
همین طوره دقیقا از dev استفاده می کنم.اگر ممکن است روشی رو به من بگید تا همون کدی رو که ارائه فرمودید رو بدون هیچ کم ویا زیاد کردن بتونم کامپایل کنم.با تشکر.

Coder#
دوشنبه 03 شهریور 1393, 02:09 صبح
همین طوره دقیقا از dev استفاده می کنم.اگر ممکن است روشی رو به من بگید تا همون کدی رو که ارائه فرمودید رو بدون هیچ کم ویا زیاد کردن بتونم کامپایل کنم.با تشکر.

سادست. برنامه به زبان C نوشته شده، پس با پسوند C. ذخیره اش کن.

Coder#
دوشنبه 03 شهریور 1393, 08:46 صبح
البته چون از ++DEV C استفاده می کنی این رو گفتم، وگرنه استانداردش اینه که نام تابع و پارامترهای اون حتما اعلان یا اعلام بشن. (این رو گفتم تا اشتباه نگیری که نیازی به اعلان تابع dec2bin نیست)
اگر تابع ما مثلا

char f (char s[]) {...}

می بود، بنابراین با پیغام خطا مواجه خواهی شد، اما با dec2bin کاری نداره. این C استاندارد نیست، و درستش همینه (http://barnamenevis.org/showthread.php?466139-%D9%81%D8%B1%D9%82-amp-amp-%D8%A8%D8%A7-amp-%D9%88%D9%81%D8%B1%D9%82-%D8%A8%D8%A7&p=2088421&viewfull=1#post2088421). در نتیجه ++DEV C کارش درست نیست.