Makro w C - dlaczego tak działa

0
#include<stdio.h>

#define sqr(i) i*i
int main()
{
   printf("%d %d\n", sqr(3), sqr(3+1)); 
}
 

dlaczego na wyjściu pojawia się:
9 7

0

A czego sie spodziewałeś?

2
#define sqr(x) (x)*(x)
  • nie używaj makr.

Alternatywa dla C++:

template<typename T>
auto sqr(T x) { return x * x; }

Lub jeżeli lubisz wydziwiać:

auto sqr = [](auto x){ return x * x; };

Lub jeśli lubisz cholernie wydziwiać:

template<typename T>
auto sqr(T x) { return std::multiplies<T>{}(x, x); }

Lub jeśli lubisz cholernie wydziwiać chcąc obliczyć wynik później:

template<typename T>
auto sqr(T x) { return [=]{ return x * x; }; }
//np: sqr(3+1)()
2
  1. Ile to 3+1*3+1
  2. Nie używaj makr pisząc w C++
0

Ok już wszystko jasne. Pytanie znalazłem w teście.

2

A jak chcesz być bardzo poprawny to

template<typename T>
concept bool squareable = requires(T c) { // squareable wtf
    operator*(c,c);
};

template<squareable T>
auto sqr(T &&x) { return x * x; }

1 użytkowników online, w tym zalogowanych: 0, gości: 1