man*_*m-n 5 c c++ linux operators gcc-warning
int main()
{
int i, c;
i:
for (i = 0; i < 3; i++) {
c = i &&&& i;
printf("%d\n", c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面编译的程序的输出gcc是
0
1
1
Run Code Online (Sandbox Code Playgroud)
如何在上述计划中评估?
Omk*_*ant 28
在这种情况下,它也被解析为&&和&&.第一个是logical AND第二个,但第二个&&是标签i的地址而不是变量的地址i.(它的gcc扩展名)
这将被解析为 c = (i) && (&&i); //括号只是为了使它具有人类可读性.
&给你变量的地址i.几分钟前你刚才在这个问题上提出的问题.
有关标签和值的地址的更多信息,请参阅此gcc扩展名.
编辑:因为&&逻辑AND总是跟随语句的短路.在第一种情况下,它将是0因为它发现i=0所以它不会去&&i(逻辑表达式的第二部分).
但是在所有后续的情况下,i并不是0这样,它会给出TRUE并将转到下一个表达式&&i,即标签的地址i(并且地址i将始终评估为TRUE.)
所以充分表达的结果将总是TRUE装置1除了其中第一种情况i是0.因此,你看到了结果
0
1
1
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 25
使用标签作为值是一个gcc扩展(见这里).你的表达段:
c = i &&&& i;
Run Code Online (Sandbox Code Playgroud)
等于:c = i &&(&& i); &&i标签的地址在哪里i.
请记住,你在这里组合了两个完全不同的i"对象".第一个是i循环的变量0, 1, 2,而第二个是标签i,地址总是一些非零值.
这意味着,放置在C中的结果将是0(假),只有当变量 i是0.这就是你获得0, 1, 1序列的原因.
顺便说一句,如果我的一个小伙子给我买了这样的代码供生产使用,我会认真考虑"员工管理实践".在我看来,任何能消除这种怪物可能性的东西都是好事:-)
| 归档时间: |
|
| 查看次数: |
1211 次 |
| 最近记录: |