সি তে &&& অপারেশন কী


195
#include <stdio.h>

volatile int i;

int main()
{
    int c;

    for (i = 0; i < 3; i++) 
    {
         c = i &&& i;
         printf("%d\n", c);
    }

    return 0;
}

উপরের প্রোগ্রামটি ব্যবহার করে সংকলিত আউটপুটটি gccহ'ল

0
1
1

বিকল্প -Wallবা -Waddressবিকল্পের সাথে gccএকটি সতর্কতা জারি করে:

warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]

cউপরের প্রোগ্রামে কীভাবে মূল্যায়ন করা হচ্ছে?


42
আমি বিশ্বাস করি এটা i && (&i)? আকর্ষণীয় যে এসওতে আমি একটি সদৃশ পোস্ট খুঁজে পাচ্ছি না।
— অপ্রাসঙ্গিক

42
while (i &&& i <-- j) {}।
— কেনেটিএম


8
কোনও সদৃশ নয়, তবে একই প্রশ্ন এবং এটি একটি ভাল লিঙ্ক
— নাথান কুপার

উত্তর:


272

এটি c = i && (&i);দ্বিতীয় অংশটি অপ্রয়োজনীয় হওয়ায় এটি &iকখনই মূল্যায়ন করবে না false।

কোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য, যেখানে আপনি প্রকৃতপক্ষে অযাচিত ওভারলোড করতে পারেন operator &, এটি আলাদা হতে পারে তবে এটি এখনও খুব খারাপ ধারণা ।

আপনি যদি সতর্কতা চালু করেন , আপনি এমন কিছু পাবেন:

সতর্কতা: 'আমি' এর ঠিকানাটি সর্বদা 'সত্য' হিসাবে মূল্যায়ন করবে


1
কেন নয় c = i & (&&i);:; iকিছু লেবেল কোথায় ?
— আনিসনে

4
@ নানসানেকে iসংজ্ঞায়িত করা হয়েছে intএবং প্রশ্নটিতে কোনও লেবেল নেই। এছাড়াও, সর্বাধিক কাঁচা ...
— লুচিয়ান গ্রিগোর

5
@ নানশানে: এবং &&কোনও লেবেলের ঠিকানা নিতে অপারেটরটি যাইহোক, মানহীন জিসিসি এক্সটেনশন। তবে এটি মানসম্পন্ন হলেও সর্বাধিক মামুনের নিয়ম এটিকে পার্স করা থেকে আটকাতে পারে (যদি আপনি কোনও স্থান সন্নিবেশ না করেন)।
— কিথ থম্পসন

আসলে, &iমূল্যায়ন করতে পারেন false। এটি কখনও কখনও খেলাপি জন্য ব্যবহৃত হয়। উদাহরণ: void fn(type& x = *reinterpret_cast<type*>(NULL)); মান কি &xমধ্যে fnযদি fnপরামিতি ছাড়া বলা হয়? এটা 0 ওরফে মিথ্যা। যাইহোক, এটি বর্ণিত উপায়ে ব্যবহার করা, এটি না থাকলে সর্বদা সত্য হবে i == 0এবং যদি আমি এটি বর্ণিত হিসাবে যদি এটি ব্যবহার করে তবে তা হবে c = &i && i।
— অ্যাড্রিয়ান

@ লুচিয়ানগ্রিগোর: কীভাবে?
— অ্যাড্রিয়ান

118

&&&সি তে কোনও অপারেটর বা টোকেন নেই তবে &&(লজিকাল "এবং") এবং &(অকার্যকর ঠিকানা-বা বিটওয়াইজ "এবং") অপারেটর রয়েছে।

দ্বারা সর্বোচ্চ মুখ না খুলিয়া চিবানো নিয়ম, এই:

c = i &&& i;

এর সমতুল্য:

c = i && & i;

এটা তোলে সেট করে c1 উভয় খুঁজতে এবং তাতে iএবং &iসত্য, এবং 0 যদি এতদুভয় থেকে মিথ্যা।

কোন int এর জন্য, কোনও শূন্য-মান মান সত্য। পয়েন্টারের জন্য, কোনও নন-নাল মান সত্য (এবং কোনও সামগ্রীর ঠিকানা সর্বদা নন-নাল থাকে)। তাই:

এটা তোলে সেট করে c1 থেকে যদি iঅ শূন্য হয়, অথবা 0যদি iশূন্য সমান।

যা বোঝায় যে &&&এখানে কেবল ইচ্ছাকৃত অবনতির জন্য ব্যবহৃত হচ্ছে। অ্যাসাইনমেন্ট পাশাপাশি নিম্নলিখিত যে কোনও হতে পারে:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.