在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),但使用至少两个具有某种有用目的的案例标签?
C1x已成为ISO/IEC 9899:2011又名C11.
有谁知道2011年4月草案n1570标准中有哪些变化(如果有的话)?
ETA:有从伦敦(2011年3月)的委员会会议记录(其中应包括在n1570)这里,从华盛顿特区(2011年10月)在这里 ; 我想DC分钟中接受的变化列表应涵盖的内容.
我有以下问题:根据当前的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 == 0并g.b == 3同时在TCC g.j == 3和g.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++都采用C语言的特性,但C语言也标准化了C++特性.C1x已经获得了完整的表达临时表(之前它只有序列点临时表).C1x也从C++ 11线程工作中获益.
我想知道C1x从C++中获得了哪些其他功能?
通过使用这样的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不重叠?
C99仍然不受许多编译器的支持,现在很大程度上关注C++及其即将推出的标准C++ 1x.
我很好奇C会在下一个标准中获得什么,何时会获得它,以及它将如何保持C的竞争力.众所周知,C和C++是相互依赖的改进,C是否会以C++ 1x标准为基础?
在C的未来,我能期待什么?
标准规定十六进制常量如0x8000(大于有符号整数)是无符号的(就像八进制常量一样),而像32768那样的十进制常量是长符号.(确切的类型假设一个16位整数和一个32位长.)但是,在常规C环境中,两者都具有相同的表示形式,二进制1000 0000 0000 0000.这种差异真的会产生不同的结果吗?换句话说,这种差异是否重要?
我发现以下代码片段(我认为在维基百科中)会在识别C++注释时创建不同的运行时:
int a = 4 //* This is a comment, but where does it end? */ 2
;
Run Code Online (Sandbox Code Playgroud)
但直到现在,这是唯一一个(不包括变体).
我对区分使用__STDC__等不感兴趣,而不是C89无法编译的程序.
是否有其他程序/片段与C99产生不同的C89运行时间?
我可以看到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)
[编辑:澄清:两者volatile并restrict适用于指针,而不是指向的对象!]
这是语言所允许的构造,但本身是无用的,还是我错过了一些有价值的应用领域?
最近我一直对C标准化感兴趣.我想参与C1X的开发.我想提出我的想法(不论他们被接受/拒绝).
我想知道这个程序.WG14文档显示按邮件列表排序的各种文档.我在哪里可以加入一个这样的邮件列表?如何提交提案?我已经看到了一些提案,似乎初始提案没有特定的格式.在文件的最后,C9X批准的提案状态很少提供有关该过程所涉及的所有6个阶段的信息.