我在cppreference的文档中看到了这个例子std::numeric_limits
#include <limits>
#include <iostream>
int main()
{
std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";
std::cout << "uchar\t"
<< +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
<< +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
<< +std::numeric_limits<unsigned char>::max() << '\n';
std::cout << "int\t"
<< std::numeric_limits<int>::lowest() << '\t'
<< std::numeric_limits<int>::min() << '\t'
<< std::numeric_limits<int>::max() << '\n';
std::cout << "float\t"
<< std::numeric_limits<float>::lowest() << '\t'
<< std::numeric_limits<float>::min() << '\t'
<< std::numeric_limits<float>::max() << '\n';
std::cout << "double\t"
<< std::numeric_limits<double>::lowest() << '\t'
<< std::numeric_limits<double>::min() << '\t'
<< std::numeric_limits<double>::max() …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,第一次调用foo是不明确的,因此无法编译.
第二个,+在lambda之前添加,解析为函数指针重载.
#include <functional>
void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }
int main ()
{
foo( [](){} ); // ambiguous
foo( +[](){} ); // not ambiguous (calls the function pointer overload)
}
Run Code Online (Sandbox Code Playgroud)
+这里的符号是什么?
我的程序中有一个奇怪的错误,经过几个小时的调试后,我发现了以下非常愚蠢的行:
int a = b * (c * d * + e)
Run Code Online (Sandbox Code Playgroud)
如果你没有看到它:在d和e我之间写的* +,只是一个+意图.
为什么这会编译,它实际上意味着什么?
Size_t被定义为一个unsigned整数,但它的大小取决于你是在32位还是64位机器上.什么是正确和便携的打印方式size_t?
Java的一元加运算符似乎来自C,通过C++.
int result = +1;
Run Code Online (Sandbox Code Playgroud)
它似乎有以下影响:
int如果它不是已经int或更宽,则提升其操作数在我看来,有更好/更清晰的方法来做所有这些事情.
在这个SO问题中,关于C#中的对应运算符,有人说"如果你觉得有必要,它就会超载".
但是,在Java中,不能超载任何运算符.那么这个一元加运算符是否只存在于Java中,因为它存在于C++中?
一元运算+符是否仅包含与一元运算-符对称,还是在C++代码中找到了一些实际用途?
在这里搜索,我遇到了C中一元'+'运算符的目的是什么?,但唯一有用的场景涉及预处理器宏.这些都是很好的,但它们似乎是一些不常见的情况,并涉及宏.是否有涉及更常见的C++代码的用例?
直到现在我才相信没有使用一元+算子.
但后来我遇到了以下示例:
char ch;
short sh;
int i;
printf("%d %d %d",sizeof(ch),sizeof(sh),sizeof(i)); // output: 1 2 4
printf("%d %d %d",sizeof(+ch),sizeof(+sh),sizeof(i)); // output: 4 4 4
Run Code Online (Sandbox Code Playgroud)
这是否意味着+在这里进行类型转换?
因为它的行为与以下相同
printf("%d %d %d",sizeof((int)ch),sizeof((int)sh),sizeof(i)); // output: 4 4 4
Run Code Online (Sandbox Code Playgroud)
这迫使我认为+是在进行类型转换.
但后来我尝试了 double
double f;
printf("%d %d",sizeof(+f),sizeof((int)f),sizeof(f)); // output: 8 4 8
Run Code Online (Sandbox Code Playgroud)
这迫使我重新思考一元运算+符.
所以我的第二个问题是:一元+算子对算子有特殊影响sizeof吗?
我知道C&C++都是不同的语言,今天我在下面的程序中做了一点点错误,但程序在各种C++编译器上编译得很好(g ++,clang,MSVC++)
考虑以下计划:
int main()
{
int s[]={3,6,9,12,18};
int* p=+s; // Observe this strange looking initialization due to use of unary + operator
}
Run Code Online (Sandbox Code Playgroud)
上述程序在编译C++罚款(见现场演示这里),但不是在C(见现场演示这里).我的编译器(gcc 4.8.1)给出了当我编译它作为一个C程序我下面的错误.
[Error] wrong type argument to unary plus
Run Code Online (Sandbox Code Playgroud)
一元加运算符在这里服务的目的是什么?它到底在做什么?为什么C不允许?
我有以下声明,它编译:
static unsigned char CMD[5] = {0x10,0x03,0x04,0x05,0x06};
int Class::functionA(int *buflen)
{
...
int length = sizeof(CMD); + *buflen; // compiler should cry! why not?
...
}
Run Code Online (Sandbox Code Playgroud)
为什么我没有编译错误?
如何+variable操作或+(+variable)操作?
int i=0;
while(+(+i--)!= 0){
// do
}
Run Code Online (Sandbox Code Playgroud)