LINUX.ORG.RU

if-else:

if (var1) {
    var4 = var2;
} else {
    var4 = var3;
}
Только левая часть будет вычисляться единожды.

xaizek ★★★★★
()

Тернарный оператор:

value = contition ? when-true-value : when-false-value;
аналогичен такой вот такой конструкции
if (condition)
    value = when-true-value;
else
    value = when-false-value;

KennyMinigun ★★★★★
()

через тернии к звездам

anonymous
()

Понял. Спасибо всем отозвавшимся.
Еще вопрос - Зачем так пишут (пример из xfce4-cpufreq-plugin.c):

gboolean hide_label = (!cpuFreq->options->show_label_freq &&
						   !cpuFreq->options->show_label_governor);
...
xfce_panel_plugin_set_small (cpuFreq->plugin, hide_label ? TRUE : FALSE);
?

superuser ★★★★☆
() автор топика
Последнее исправление: superuser (всего исправлений: 3)
Ответ на: комментарий от superuser

Зачем так пишут

gboolean, сер. (обращаю внимание на приставку g*)

Т.е. наверное так принято в проекте для пущей выразительности кода.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

gboolean определён как gint, FALSE как 0, TRUE как !FALSE. Так что во всей этой простыне нет смысла. Разве что кодинг стайл им запрещает писать !!hide_label.

Deleted
()
Ответ на: комментарий от superuser

Там обычный int под капотом. Когда надо свести всё к двум значениям, обычно используется !! (двойное отрицание).

Но тут решили через тернарный оператор написать зачем-то.

Deleted
()
Ответ на: комментарий от superuser

Oно может быть кроме TRUE или FALSE еще чем-то?

Технически да, так как это просто тайпдеф на int. А int (традиционно) может иметь 2^32 значений. Однако в сишке логика такова, что все что не 0 есть TRUE. Т.е. нет разницы что там когда оно не ноль.

Из документации GLib:

typedef int gint
typedef gint gboolean
https://people.gnome.org/~desrt/glib-docs/glib-Basic-Types.html#gint
https://people.gnome.org/~desrt/glib-docs/glib-Basic-Types.html#gboolean

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

Если a истино, то b истино, иначе b ложно.

Если var1 истино, то var4 равно var2, иначе var4 равно var3.

xDShot ★★★★★
()
Ответ на: комментарий от Deleted

Так и понял что там инт и это ради перестраховки. Спасибо.

superuser ★★★★☆
() автор топика
Ответ на: комментарий от Deleted

Разве что кодинг стайл им запрещает писать !!hide_label.

Я тоже так подумал. Может аргументируют так

// what is hide_label? a boolean? a function name/address? a pointer?
some_func(hide_label);

// obvious: hide_label is a logical expression (boolean)
some_func(hide_label ? TRUE : FALSE);

Однако, с моей точки зрения это уже наркомания. Плюс еще можно попутать местами значения TRUE FALSE в тернарке и никакого варнинга не будет.

KennyMinigun ★★★★★
()

По вычислению вопрос закрыт. Ох уж этот C...

superuser ★★★★☆
() автор топика
Ответ на: комментарий от KennyMinigun

Ну или могло от рефакторинга остаться после замен sed-ом.

Deleted
()

Переменная глобальная или локальная? Если глобальная, то false; если локальная — то как получится (а точнее !a и тоже, как получится).

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от superuser

Угу, глобальные переменные инициализируются умолчальными значениями, локальные (те что в стеке) — нет. Это неплохо бы знать.

beastie ★★★★★
()

Долбоеб какой-то код писал. Там тернарный оператор нафиг не нужен, хватит

b = a

anonymous
()
Ответ на: комментарий от clover

не факт, если gboolean - это int, а TRUE == 1 и FALSE == 0. вполне себе вероятен вариант, когда b == 1 и a == 38475

Тип b тоже gboolean, что намекает на использование его именно именно в этом смысле. А раз так, то не имеет значения, что было записано в a.

Но да, можно было бы записать и b = a != FALSE; или b = !!a;.

andreyu ★★★★★
()
Ответ на: комментарий от Deleted

Разве что кодинг стайл им запрещает писать !!hide_label.

а написать просто hide_label не модно, раз уж всё равно сокращать?

next_time ★★★★★
()
Ответ на: комментарий от next_time

а написать просто hide_label не модно, раз уж всё равно сокращать?

Как уже выше говорили, gboolean это тайпдеф на int, а там может быть не только 0 или 1. Вот для этого и придумана магия !!var

andreyu ★★★★★
()
Ответ на: комментарий от next_time

которая, вообще говоря, не работает

Да вроде работает:

$ cat t.cpp 
#include <stdio.h>

int main(void)
{
    int i = 1343;
    int j = !!i;
    ::printf("i: %d, j: %d\n", i, j);

    return 0;
}

$ make t
c++     t.cpp   -o t

$ ./t
i: 1343, j: 1
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

так стандарт не обязывает компиляторы поступать именно так, лишние операции компилятор имеет право выкинуть

и посчитает ли он два знака "!" лишней операцией зависит от версии компилятора и погоды на Марсе

next_time ★★★★★
()
Ответ на: комментарий от KennyMinigun

А int (традиционно) может иметь 2^32 значений.

скажи это компилятору Turbo C

dzidzitop ★★
()
Ответ на: комментарий от next_time

так стандарт не обязывает компиляторы поступать именно так, лишние операции компилятор имеет право выкинуть

Может ты стандарт сначала почитаешь?

Deleted
()
Ответ на: комментарий от andreyu

например, поскольку true - это не «1», а «не 0», то по стандарту можно хоть 10 на выходе операции "!" получить или я не прав?

next_time ★★★★★
()
Ответ на: комментарий от andreyu

Ну да, т.е. переменная типа bool может содержать в себе 0 (false) и любое другое целочисленное значение (true). То есть, любое целое число.

next_time ★★★★★
()
Ответ на: комментарий от next_time

> Может ты стандарт сначала почитаешь?

нет

В честь субботы я почитаю тебе с выражением вслух, так и быть:

например, поскольку true - это не «1», а «не 0», то по стандарту можно хоть 10 на выходе операции "!" получить или я не прав?

Раздел 6.5.3.3, пункт 5. «The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).»

Deleted
()
Ответ на: комментарий от next_time

Стандарт C11: 6.5.3.3 Unary arithmetic operators
The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).

Результат оператора логического отрицания ! равен 0 если значение операнда не равно 0, 1 если значение операнда равно 0. Результат имеет тип int. Выражение !E эквивалентно выражению (0 == E).

goto-vlad
()
Ответ на: комментарий от next_time

но только это С, причём 11

Что значит «причём 11»? Это с основания языка, а не с «11».

а что там в С++? вроде должно к bool привестись

Открой и почитай. ЛОРовские чтения вслух сегодня закончены.

Deleted
()
Ответ на: комментарий от next_time

На тебе из C++:
The operand of the logical negation operator ! is contextually converted to bool (Clause 4); its value is true if the converted operand is false and false otherwise. The type of the result is bool.

И:
If the source type is bool, the value false is converted to zero and the value true is converted to one.

goto-vlad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.