什么是 C 语言中的 &&&&操作
What is &&& operation in C
#include <stdio.h>
volatile int i;
int main()
{
int c;
for (i = 0; i < 3; i++)
{
c = i &&& i;
printf("%dn", c);
}
return 0;
}
使用gcc
编译的上述程序的输出为
0
1
1
使用-Wall
或-Waddress
选项,gcc
发出警告:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
在上述计划中如何评估c
?
这是c = i && (&i);
,第二部分是多余的,因为&i
永远不会评估false
。
对于用户定义的类型,您实际上可以重载一元operator &
,它可能会有所不同,但这仍然是一个非常糟糕的主意。
如果您开启警告功能,则会收到类似以下内容:
警告:"i"的地址将始终评估为"true"
C 中没有&&&
运算符或标记。 但是&&
(逻辑"和")和&
(一元地址或按位"和")运算符确实存在。
根据最大咀嚼规则,这:
c = i &&& i;
相当于这个:
c = i && & i;
如果 i
和 &i
都为真,则它将 c
设置为 1,如果其中任何一个都为假,则设置为 0。
对于 int,任何非零值都是 true。对于指针,任何非空值都是 true(并且对象的地址始终为非空)。所以:
如果i
不为零,则c
设置为 1;如果i
等于零,则设置为 0
。
这意味着&&&
在这里仅用于故意混淆。分配也可以是以下任何一项:
c = i && 1;
c = !!i;
c = (bool)i; // C++ or C with <stdbool.h>
c = i ? 1 : 0; /* C */
c = i ? true : false; // C++
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 不同语言中相同代码的不同行为
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 有什么语言可以与C++互操作吗
- Boost状态机语言-"操作"中的"发布"事件
- 什么是 C 语言中的 &&&&&操作
- 什么是 C 语言中的 &&&&操作
- QTcpServer语言 - Android上不支持的Socket操作