我有一些代码,如下面的代码块(我不允许发布原始代码)在.cpp我认为由clang++(Ubuntu clang version 3.5.2-3ubuntu1 (tags/RELEASE_352/final) (based on LLVM 3.5.2))编译的文件中.
它看起来像C代码,因为我们GoogleTest用于测试我们的C代码.无论如何:
size_t const SHIFT = 4;
uint8_t var, var2;
/* Omitted: Code that sets var to, say 00011000 (base 2) */
var2 = var;
var = var << SHIFT >> SHIFT; // [1] result is 00011000 (base 2) (tested with printf)
var2 = var2 << SHIFT;
var2 = var2 >> SHIFT; // [2] result is 00001000 (base 2) (tested …Run Code Online (Sandbox Code Playgroud) 在C编程练习中,我正在做这样的事情(只是简化):
printf( "%s", 0);
Run Code Online (Sandbox Code Playgroud)
输出是
(null)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我假设printf将零解释为a char *,那么NULL?我怎么能用这样的东西复制这个结果
char string[] = NULL; //compiler-error
printf( "%s", string);
Run Code Online (Sandbox Code Playgroud)
?
我刚读完了第二版K&R的"The C Programming language"的语言参考(附录A),以获得一份新工作.
请注意,我已经制定了如何通过SO上的所有指导来阅读C声明(非常感谢;)).解释一直是对C语言中表达式和运算符的优先级的引用.
我可以从参考手册中推断出相同的优先级表,即所述书中的附录A,§A7,没问题.
但是,§A7处理表达式运算符的优先级,如本节开头所述 - 方括号postfix-expression [ expression ]在此处被视为下标运算符,星号*被视为间接运算符,括号( argument-expression-list)或()与函数调用有关,请参阅§A7.3.
那么为什么这么多人会引用这个优先级表,当主题是C声明时,甚至会在SO上得到几个赞成?它声称定义的唯一优先级是某些表达式运算符.
如何解析声明是在§A8中编写的,尤其是§A8.6介绍了更复杂的声明的基础知识.
但是在整个附录A中,没有关于优先顺序,方括号,星号,类型名称等要解析的说法.
它在第216页说,括号可能会改变复杂声明符的绑定,但现在如何(虽然我有预感,请参阅下面的示例).
让我举一个"伪代码"的例子,我在这里使用§A8.8(类型说明符的T代表,声明符的D代表).
阅读C声明:
Original declaration:
char (*(*f())[])()
/* Have to use A8.6.3, because of how the decl. looks: */
Now let T=char , D=(*(*f())[])()
D=D1(), where D1=(*(*f())[])
The type of f, according to A8.6.3 is then
:L1 /* label 1 */
f is "type-modifiers of f in D1" function returning char /* …Run Code Online (Sandbox Code Playgroud)