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


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.