avva: (Default)
[personal profile] avva
Гуляя по исходникам ядра Линукса в поисках информации о том, как в нём устроены real-time signals (см. 'man 7 signal', если вы не знаете, что это такое), я обнаружил случайно весьма удивительную конструкцию в C:

Оператор условного выбора ?:, но без второго операнда. То есть вместо обычного, скажем,

a = b ? c : d;

(что означает: если b, то присвоить a=c; иначе присвоить a=d), пишется, например, так:

a = b ? : d;

По контексту становится ясно, что это означает: если b, то a=b; иначе a=d.

(кстати, весьма неинтуитивно; самым очевидным кажется такая интерпретация: если b, то a не меняется, иначе a=d. Но, конечно, на самом деле такая интерпретация невозможна, т.к. согласно семантике языка выражение (b ? : d) должно иметь какое-то определённое значение)

Так вот, я такого никогда в жизни не видел, и не подозревал даже, что так можно писать. Теперь мне интересно, это разрешено каким-то стандартом, или это какое-то расширение gcc? Знает ли кто?

Пример "живого" использования в исходнике ядра Линукса см. например в файле net/ipv4/tcp.c, там их шесть штук (в 2.4.20 по крайней мере). Например:

val = (tp->keepalive_time ? : sysctl_tcp_keepalive_time)/HZ;

Date: 2003-09-30 01:10 am (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
В смысле, x || y

Re: программистское: C, Unix

Date: 2003-09-30 01:19 am (UTC)
From: [identity profile] avva.livejournal.com
Да, спасибо. Как раз gcc.info у меня под руками не оказалось почему-то.
Если не ошибаюсь, значение x||y не гарантировано ==x в случае, если x не равно 0; всё, что гарантировано, это то, что only x is evaluated and the result evaluates as true (т.е. компилятор может выбрать ставить всегда 1 в качестве результата в таких случаях). Впрочем, моя память, возможно, меня подводит в этом пункте.

(а вот в перле, скажем, x||y всегда равно x, если x evaluates as true)

Re: программистское: C, Unix

Date: 2003-09-30 01:28 am (UTC)
From: [identity profile] muchacho.livejournal.com
Из MSDN/C Language Reference:
"The logical-OR operator performs an inclusive-OR operation on its operands. The result is 0 if both operands have 0 values. If either operand has a nonzero value, the result is 1."

January 2026

S M T W T F S
    1 2 3
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 3rd, 2026 03:55 pm
Powered by Dreamwidth Studios