Soru Neden güç operatörüm (^) çalışmıyor?


#include "stdio.h"
#include "math.h"

void main(void)
{
    int a;
    int result;
    int sum=0;
    printf("Enter a Number : ");
    scanf("%d",&a);
    for(int i=1;i<=4;i++)
    {
        result = a^i;

        sum =sum+result;
    }
    printf("%d\n",sum);
}

Neden bu '^' neden güç olarak çalışmıyor bilmiyorum.


44
2018-01-30 14:02


Menşei


"İnt" ile main () dönüş değerini değiştirdikten sonra benim için iyi çalışıyor. Bununla birlikte çalışmasını beklemiyordum. <stdio.h> ve <math.h> yerine genellikle kullanılır "stdio.h" ve "math.h". Ama GCC'nin gerçekten umurunda değil gibi görünüyor. - Sergey Tachenov
@Abid Soruları düzenlemek genellikle çok iyidir, ancak bu durumda düzenlemeler soruyu anlamsızlaştırmıştır (sorunu çözümle değiştirdiniz). Orijinal soruları bırakmak diğerlerinin öğrenebileceği şekilde daha iyi - ama şimdi sadece kafa karıştırıcı (soruda "^" yoktur). Bir soru olarak mantıklı olan son düzenlemeye dönmenizi önerin - peter.murray.rust
Kullanıma geri döndü ^ çünkü soru (ve cevaplar) aksi halde az anlam ifade eder. Peoro sorunuza doğru cevap verdiğinden, onu kabul etmeli ve devam etmelisiniz. Eğer varsa bir diğeri soru, daha sonra başka bir soru sor. Tüm çalışmaları anlamsız yapmak için bunu düzeltmeyin. - paxdiablo
@Sergey Tachenov: Oh, şimdi pow () kullandığınızı görüyorum? OP'nin orijinal kodunu (pow için) çalıştıracağını sanıyordum. - Oystein
void main??? Ew ... - Paul R


Cevaplar:


İlk önce, ^ C / C ++ operatöründe bit-bit XOR bulunur. Güçlerle ilgisi yok.

Şimdi, senin pow() fonksiyonu, biraz googling argümanlardan birini ikiye katlamaya yardımcı olduğunu gösterir:

result = (int) pow((double) a,i);

Ayrıca, sonuca da int hepsi gibi pow() aşırı yükler çift dönüş, değil int. Bir MS derleyicim yok, bu yüzden yukarıdaki kodu kontrol edemedim.

C99'dan beri Ayrıca orada float ve long double çağrılan işlevler powf ve powl sırasıylaeğer bu herhangi bir yardımsa.


64
2018-01-30 14:38





C içinde ^ bitly XOR:

0101 ^ 1100 = 1001 // in binary

Güç için operatör yok, kullanmanız gerekecek pow math.h işlevi (veya başka bir benzer işlev):

result = pow( a, i );

59
2018-01-30 14:04



Bu işlevi kullandım .. ama: / aşırı yüklenme işlevine belirsiz bir çağrı veren bir hata veriyor .. - Abid Ali
@Abid Ali: math.h eklemeniz gerekir. Bu satırı dosyanızın başına koyun: #include <math.h> - peoro
@Abid Ali: program C kodunuzu yazmak ve derlemek için kullandığınız C kodunun C standardına uymadığı: geçerli C kodunu derleyemez. Nedenini bilmiyorum. Daha standart bir uyumlu derleyiciye geçmenizi öneririm. Pencereleri kullanıyorsanız, programlarınızı, derleyici olarak GCC kullanan Dev-C ++ (örneğin) programında indirmeyi ve yazmayı deneyin. Bu kodun neden microsoft studio ile çalışmadığını öğrenmenize yardımcı olamam. - peoro
@peoro, aşırı yüklü makrolar? Makrolar yazılmamış, herhangi bir şeyi kabul ediyorlar. Ve isimlendirme olmadığı için C aşırı yüklü fonksiyonlara sahip olamaz. Hata hakkında bazı googling, bir çözümün argümanlardan birini ikiye katlamak olduğunu gösteriyor. (int) pow((double) a,i) - Sonucunu ben de çifte döndürürüm, int değil. - Sergey Tachenov
@Abid Ali: Bu satırı şu şekilde değiştirmeyi deneyin: pow( (double)a, (double)i ); - peoro


pow () ile çalışmıyor int, dolayısıyla hata "C2668: 'pow' hatası: aşırı yüklü işleve belirsiz çağrı"

http://www.cplusplus.com/reference/clibrary/cmath/pow/

İçin kendi güç fonksiyonunuzu yazın ints:

int power(int base, int exp)
{
    int result = 1;
    while(exp) { result *= base; exp--; }
    return result;
}

6
2018-01-30 14:19



ints otomatik olarak tanıtılmalıdır doubledeğil mi? Yine de bağlantın C ++ ile ilgili. - peoro
Bu işlev, yüzer ve ikilileri kabul ettiğinden, bunu ints ile çağırdığınızda, hangi türlerin tanıtımını yapması gerektiğini bilmez. - Max
"Senin bağlantın yine de C ++ hakkında." Ancak, poster aşırı yüklenme nedeniyle bir hataya sahip olduğundan C ++ derleyicisini kullanıyor. - Max
Bu birkaç yolla optimal değildir. Öncelikle, döngüde verilen süreyi döngüde geçireceksiniz. İnt büyüklüğüne bağlı olarak bu oldukça fazla olabilir. Ancak anlamlı olan en büyük üstat pow (2, sizeof (int) * CHAR_BIT-1). Ancak iyileştirme için daha fazla yer var. pow (x, y) == pow (2, n) * pow (x ', r). Pow (2, n) terimi, n ile basit bit vardiyasıyla uygulanabilir. X 've r'nin belirlenmesi, bu döngüyü yinelemekten daha hızlı olabilir. - datenwolf
Algoritma ders kitaplarında gösterildiği gibi, en basit uygulamayı örnek olarak verdim. - Max


Her şeyden önce ^ bir Bitwise XOR operatörü  değil güç operatörü.

Herhangi bir sayının gücünü bulmak için başka şeyler kullanabilirsiniz. Kullanabilirsiniz herhangi bir sayının gücünü bulmak için döngü 

İşte x ^ y i.e. x bulmak için bir programy

double i, x, y, pow;

x = 2;
y = 5; 
pow = 1;
for(i=1; i<=y; i++)
{
    pow = pow * x;
}

printf("2^5 = %lf", pow);

Ayrıca sadece kullanabilirsiniz Herhangi bir sayının gücünü bulmak için pow () işlevi

double power, x, y;
x = 2;
y = 5;
power = pow(x, y); /* include math.h header file */

printf("2^5 = %lf", power);

3
2017-07-29 15:45





Aslında pow (sayı, güç) kullanmalısınız; Ne yazık ki, kara cisimleri C.'de bir güç işareti olarak çalışmazlar. Birçok kez, eğer kendinizi başka bir dilde yapamayacağınızı fark ederseniz, onun sizin için fark yaratan bir işlevi vardır.


1
2018-01-30 14:07



Carets "iş" yapar, sadece onları beklediğiniz şeyi yapmazlar.
Eh, güçler için çalışmıyorlar, bunun için bir işlev gerekiyor. Ama soruyu sormuş olan kullanıcı, çalıştığı sistemin çalışmadığını, hangi metodolojinin C'de işe yaramadığını cevapladığını söyledi. Fakat geçerli bir noktaya göre, ben düzenleyeceğim. - Nick Anderegg
@paxdiablo O zamandan beri düzenledim. - Nick Anderegg


math.h dosyasını ekleyin ve gcc test.c -lm ile derleyin


1
2018-01-30 14:12



Korkarım OP GCC'yi kullanmıyor. :-( - peoro
GCC VE test.c -lm nedir? - Abid Ali
@Abid: hangi derleyiciyi kullanıyorsunuz? - anup
@peoro, komik olan şey GCC'de iyi çalışıyor olmasıdır. MS derleyicisiyle neden çalışmadığını bana itiyor. - Sergey Tachenov
@Sergey Tachenov: sizinle aynı fikirdeyim: cevabım için son yorumumu oku. - peoro


Kullanmak yerine ^, Güç işlemini gerçekleştiren önceden tanımlanmış bir fonksiyon olan 'pow' işlevini kullanın ve dahil ederek kullanılabilir math.h başlık dosyası.

^ Bu sembol C, C ++ 'da BIT-WISE XOR işlemini gerçekleştirir.

değiştirmek a^i ile pow(a,i).


-3
2017-08-03 20:24



Bu, mevcut üç yıldan daha eski cevaplara yeni bir şey nasıl ekliyor? - Artjom B.
Cevabınız için teşekkür etsek de, diğer cevapların üstüne ek bir değer katsaydı daha iyi olurdu. Bu durumda, başka bir kullanıcı zaten bu çözümü yayınladığından, cevabınız ek bir değer sağlamamaktadır. Eğer önceki bir cevap size yardımcı olduysa, aynı bilgiyi tekrarlamak yerine oy vermelisiniz. - Toby Speight