LINUX.ORG.RU

Валидное ли это c-выражение?

 ,


0

4

subj:

void foo(char *a, char b, char c) {
	(a ? *a : b) = c;
}

GCC съедает без проблем, SDCC ругается что слева не lvalue.

upd. Под плюсами корректное, под си нет.

upd#2, solution.

★★★★★

Последнее исправление: thunar (всего исправлений: 5)
Ответ на: комментарий от MKuznetsov

Косвенно оно возвращает c в *a если там не нулевой указатель.
Сделано это чтобы можно было инициализировать

int &r = cond ? a : b;
в c++, в c соответсвенно такой необходимости нет и выражение невалидно

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)

Этот фокус нужно делать так:

#include <iostream>

int main()
{
    int* a = new int;
    *a = 4;
    
    // int* a = nullptr;

    int b = 5;

    *(a ? a : &b) = 10;

    if (a)
        std::cout << "a=" << *a << std::endl; 
        
    std::cout << "b=" << b << std::endl;
}
rumgot ★★★★★
()

(a ? *a : b) = c;

А в чем смысл этого выражения? Ну то есть если a=NULL, то измениться должна локальная копия b?

COKPOWEHEU
()
Ответ на: комментарий от VIT

Тут важен сам механизм присваиваивания. Для C оно будет выглядеть так же. И для char тоже. Ты по сути скажи что-то лучше. А то нашёл тоже, к чему докопаться, смехота.

rumgot ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария