Operator trójargumentowy nie chce działać?

0

Mam taką linijkę:

printf("(%d)+%d=((a+b)>0?%d:(%d))", a, b, (a+b));

. Jak widać, chodzi mi o to, żeby w przypadku sumy a i b większej od zera wynik był "goły", a przy <0 - w nawiasie. Wiem, że można zrobić dając przy wartościach w przypadku prawdy i fałszu operatora całość: printf((a+b)>0?"(%d)+%d=%d":"(%d)+%d=(%d)", a, b, (a+b));

, ale czy nie ma sposobu na ujęcie tylko ostatniego %d? Wyjęcie za cudzysłów<code class="cpp">printf("(%d)+%d="((a+b)>0?"%d":"(%d)")", a, b, (a+b));

też nie działa.

0
Tigro napisał(a)

Mam taką linijkę:

printf("(%d)+%d=((a+b)>0?%d:(%d))", a, b, (a+b));

Od kiedy kompilator kompiluje kod wewnątrz cstringów?

c = a + b;
printf(c ? "(%d)+%d=%d" : "(%d)+%d=(%d)", a, b, c);

może zadziała...

1

Łączenie łańcuchów odbywa się na etapie preprocesora ZTCW, a więc musisz posłużyć się dyrektywami preprocesora, oraz użyć stałych, które są znane w czasie kompilacji, np:

#include <cstdio>
#include <cstdlib>

int main() {

#define a 5
#define b -8
    const char *formatString = "(%d)+(%d)="
#if (a + b) >= 0
    "%d"
#else
    "(%d)"
#endif
    ;
    printf(formatString, a, b, (a+b));

    return 0;
}

Jeśli to nie są stałe znane w czasie kompilacji, to musisz posłużyć się strcat() albo std::string + std::string.

0

Dzięki :)

1

Kumashiro - prawie dobrze: fałsz jest wtedy i tylko wtedy gdy wartość wyrażenia wynosi 0, w każdym innym przypadku wyrażenie jest prawdą.

printf(a+b > 0 ? "(%d)+%d=%d" : "(%d)+%d=(%d)", a, b, a+b);
0

Rozwiązanie z ?: się nie skaluje :P

#include <cstdio>
#include <cstdlib>

int main() {

#define a1 5
#define b1 -2
#define a2 5
#define b2 -8
#define a3 7
#define b3 -2
#define a4 5
#define b4 2
    const char *formatString = "(%d)+(%d)+(%d)+(%d)+(%d)+(%d)+(%d)+(%d)="
#if (a1 + b1) >= 0
    "%d + "
#else
    "(%d) + "
#endif
#if (a2 + b2) >= 0
    "%d + "
#else
    "(%d) + "
#endif
#if (a3 + b3) >= 0
    "%d + "
#else
    "(%d) + "
#endif
#if (a4 + b4) >= 0
    "%d"
#else
    "(%d)"
#endif
    ;
    printf(formatString, a1, b1, a2, b2, a3, b3, a4, b4, a1 + b1, a2 + b2, a3 + b3, a4 + b4);

    return 0;
}
#include <cstdio>
#include <cstdlib>

int main() {
    
#if 5 > 8
#define ImieKota "Burek"
#else
#define ImieKota "Alik"
#endif
#if 6 < 4
#define ImiePsa "Alicja"
#else 
#define ImiePsa "Burek"
#endif
#if 5 == 8
#define ImiePana "Dżeki"
#else
#define ImiePana "Maciek"
#endif

    puts("Imie kota: " ImieKota ", imie psa: " ImiePsa ", imie pana: " ImiePana);

    return 0;
}

Kolejny sposób, z użyciem %s w printfie:

#include <cstdio>
#include <cstdlib>

const char* ln(int v) {
    if (v < 0) {
        return "(";
    } else {
        return "";
    }
}

const char* pn(int v) {
    if (v < 0) {
        return ")";
    } else {
        return "";
    }
}

int main() {
    int a = 5, b = -8;
    printf("(%d)+(%d)=%s%d%s", a, b, ln(a + b), (a + b), pn(a + b));

    return 0;
}
0
#if 5 > 8
#define ImieKota "Burek"
#else
#define ImieKota "Alik"
#endif
#if 6 < 4
#define ImiePsa "Alicja"
#else 
#define ImiePsa "Burek"
#endif
#if 5 == 8
#define ImiePana "Dżeki"
#else
#define ImiePana "Maciek"
#endif

dyrektywy można wcinać, w ten sposób:

#if 5 > 8
#   define ImieKota "Burek"
#else
#   define ImieKota "Alik"
#endif
#if 6 < 4
#   define ImiePsa "Alicja"
#else 
#   define ImiePsa "Burek"
#endif
#if 5 == 8
#   define ImiePana "Dżeki"
#else
#   define ImiePana "Maciek"
#endif

albo nawet ładniej tak:

# if 5 > 8
#   define ImieKota "Burek"
# else
#   define ImieKota "Alik"
# endif
# if 6 < 4
#   define ImiePsa "Alicja"
# else 
#   define ImiePsa "Burek"
# endif
# if 5 == 8
#   define ImiePana "Dżeki"
# else
#   define ImiePana "Maciek"
# endif

ważne żeby wcięcie dodawać między # a dyrektywę, a nie na początku linijki.

0

W VC++ można i wcięcia przed # dodawać.

0

Łoł.. dziękuję raz jeszcze :)

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