|
|
1
33
这是“未定义的行为”,也就是说,根据标准,你无法预测当你尝试这种方法时会发生什么。根据特定的机器、编译器和程序状态,它可以做不同的事情。
但是在某些情况下——最典型的是
在编译器和机器的其他组合中,可能会发生完全不同的事情。你要做的一件事 可以肯定的是,这种模式会惹恼任何必须阅读您的代码的人。 |
|
|
2
14
这是不确定的行为。证明:
然后运行它。输出为70(gcc 4.3)
|
|
|
3
11
修改
|
|
|
4
6
它确实与gcc一起工作。但它不喜欢:
但执行时值确实发生了变化。我不会指出明显的不-不。。。 |
|
|
5
4
是的,你可以用这样的代码来完成。但当
一般来说,在心爱的C中,你几乎总能找到一些方法来破解那些不应该被改变或暴露的东西。这里的const就是一个例子。
|
|
|
6
1
这里是指针的类型
隐式cast消除了常量,尽管gcc抛出了一个警告(请注意,这在很大程度上取决于实现)。
因为指针没有声明为
如果指针声明为
|
|
7
1
此代码包含 :
违反的约束是C116.5.16.1/1“简单赋值”;如果两个操作数都是指针,则左侧指向的类型必须具有右侧指向的类型的所有限定符。(类型sans限定符必须兼容)。
编译器必须发出诊断,并且可能不会生成可执行文件。任何可执行文件的行为都是完全未定义的,因为程序不符合语言的规则。 |
|
|
8
0
|
|
9
0
而且,行为是特定于平台和实现的。如果您运行的平台上的常量存储在不可写内存中,这显然行不通。 你到底为什么要这么做?要么更新源中的常量,要么使其成为变量。 |
|
|
10
-3
是的,您可以更改常量变量的值。
|