小编Joh*_*zem的帖子

是否有一个使用没有大括号的switch语句的有用案例?

在H&S5中,我遇到了"最离奇"的切换语句(8.7.1,第277页),没有使用大括号.
这是样本:

switch (x)
    default:
    if (prime(x))
        case 2: case 3: case 5: case 7:
            process_prime(x);
    else
        case 4: case 6: case 8: case 9: case 10:
            process_composite(x);
Run Code Online (Sandbox Code Playgroud)

这个想法似乎是为了避免prime(x)最常见的小数字的开销.

当我看到这个陈述时,我对丢失的大括号感到困惑,但是检查官方语法(C1X预标准,6.8.4,第147页),语法是正确的:switch语句只是在切换表达式之后有一个语句和右括号.

但是在我的编程实践中,我再也没有遇到过这样一个好奇的切换语句(我不想看到任何代码,我必须承担责任),但我开始想知道:

你们中的任何人都知道这样的开关表达式,一个没有使用大括号,但仍然有意义吗?不只是switch (i);(这是合法的,而是NOP),但使用至少两个具有某种有用目的的案例标签?

c language-lawyer

44
推荐指数
1
解决办法
1615
查看次数

C11的最新变化

C1x已成为ISO/IEC 9899:2011又名C11.

有谁知道2011年4月草案n1570标准中有哪些变化(如果有的话)?

ETA:有从伦敦(2011年3月)的委员会会议记录(其中应包括在n1570)这里,从华盛顿特区(2011年10月)在这里 ; 我想DC分钟中接受的变化列表应涵盖的内容.

c standards c11

34
推荐指数
2
解决办法
4952
查看次数

在C1X中初始化匿名结构或联合

我有以下问题:根据当前的C1X草案,匿名结构(或联合)如何正确初始化?这是合法的:

struct foo {
    int a;
    struct {
        int i;
        int j;
    };
    int b;
};

struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };
Run Code Online (Sandbox Code Playgroud)

在海湾合作委员会,g.j == 0g.b == 3同时在TCC g.j == 3g.b == 0.目前的草案说:

"[...]结构和联合类型的对象的未命名成员不参与初始化.结构对象的未命名成员即使在初始化之后也具有不确定的值."

这真的可以吗?是不是

struct foo h = { 0 };
Run Code Online (Sandbox Code Playgroud)

应该将所有成员设置为0?

非常感谢!

更新:

由于匿名成员似乎只在混合结构/联合时有用,如何正确初始化它:

struct bar {
    int tag;
    union {
        double …
Run Code Online (Sandbox Code Playgroud)

c standards structure anonymous c11

19
推荐指数
1
解决办法
7864
查看次数

C1x从C++继承了什么?

众所周知,C++都采用C语言的特性,但C语言也标准化了C++特性.C1x已经获得了完整的表达临时表(之前它只有序列点临时表).C1x也从C++ 11线程工作中获益.

我想知道C1x从C++中获得了哪些其他功能?

c c++ c11

17
推荐指数
2
解决办法
572
查看次数

限制结构内的关键字和指针

通过使用这样的restrict关键字:

int f(int* restrict a, int* restrict b);
Run Code Online (Sandbox Code Playgroud)

我可以指示编译器数组a和b不重叠.说我有一个结构:

struct s{
(...)
int* ip;
};
Run Code Online (Sandbox Code Playgroud)

并编写一个带有两个struct s对象的函数:

int f2(struct s a, struct s b);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我怎样才能类似地指示编译器a.ip并且b.ip不重叠?

c struct function restrict-qualifier

17
推荐指数
1
解决办法
1661
查看次数

C1x:什么时候降落,会发生什么?

C99仍然不受许多编译器的支持,现在很大程度上关注C++及其即将推出的标准C++ 1x.

我很好奇C会在下一个标准中获得什么,何时会获得它,以及它将如何保持C的竞争力.众所周知,C和C++是相互依赖的改进,C是否会以C++ 1x标准为基础?

在C的未来,我能期待什么?

c language-features c11

16
推荐指数
3
解决办法
3246
查看次数

常量32768和0x8000之间的类型区别可以有所不同吗?

标准规定十六进制常量如0x8000(大于有符号整数)是无符号的(就像八进制常量一样),而像32768那样的十进制常量是长符号.(确切的类型假设一个16位整数和一个32位长.)但是,在常规C环境中,两者都具有相同的表示形式,二进制1000 0000 0000 0000.这种差异真的会产生不同的结果吗?换句话说,这种差异是否重要?

c language-lawyer

15
推荐指数
1
解决办法
4105
查看次数

使用C89和C99编译时,C程序在运行时的行为有何不同?

我发现以下代码片段(我认为在维基百科中)会在识别C++注释时创建不同的运行时:

int a = 4 //* This is a comment, but where does it end? */ 2
  ;
Run Code Online (Sandbox Code Playgroud)

但直到现在,这是唯一一个(不包括变体).

我对区分使用__STDC__等不感兴趣,而不是C89无法编译的程序.

是否有其他程序/片段与C99产生不同的C89运行时间?

c c99 c89 language-lawyer

14
推荐指数
1
解决办法
402
查看次数

是否有一个`volatile restrict`指针的实际用途?

我可以看到const volatile合格变量的实际用途,比如

const volatile uint64_t seconds_since_1970;
Run Code Online (Sandbox Code Playgroud)

如果底层硬件机制每秒更新一次值,但该变量在(可能是嵌入式)硬件中不可写.由于所有三个(C11中的四个)类型限定符都被认为是独立的,因此似乎允许所有组合.但我restrict volatile无法想象一个真实的情况,合格的指针才真正有意义:

uint32_t * restrict volatile pointer_to_some_uint32;
Run Code Online (Sandbox Code Playgroud)

[编辑:澄清:两者volatilerestrict适用于指针,而不是指向的对象!]

这是语言所允许的构造,但本身是无用的,还是我错过了一些有价值的应用领域?

c c99 language-lawyer restrict-qualifier

12
推荐指数
1
解决办法
1110
查看次数

如何参与C标准化过程?

最近我一直对C标准化感兴趣.我想参与C1X的开发.我想提出我的想法(不论他们被接受/拒绝).

我想知道这个程序.WG14文档显示按邮件列表排序的各种文档.我在哪里可以加入一个这样的邮件列表?如何提交提案?我已经看到了一些提案,似乎初始提案没有特定的格式.在文件的最后,C9X批准的提案状态很少提供有关该过程所涉及的所有6个阶段的信息.

c standards c99 c11

11
推荐指数
2
解决办法
364
查看次数