我想知道什么时候应该投出更好.在添加,乘法等时,C++中的隐式类型转换规则是什么.例如,
int + float = ?
int * float = ?
float * int = ?
int / float = ?
float / int = ?
int / int = ?
int ^ float = ?
Run Code Online (Sandbox Code Playgroud)
等等...
表达式是否总是被评估为更精确的类型?Java的规则有所不同吗?如果我不准确地说出这个问题,请纠正我.
在Apple创建的代码中,有这一行:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Run Code Online (Sandbox Code Playgroud)
没有任何理由来表达1,000,000,000的1000*1000*1000?
为什么不1000^3呢?
我听说C11添加了泛型.我已经google了一下,看了一些文章,了解到有一个新的关键字(_Generic)和所有.但我似乎无法把握住这一切.
它是类似C#中的泛型还是C++中的模板?任何人都可以简单解释一下C11的泛型定义,它的语法和一个简单的示例用法示例吗?
假设
long long b = 5*1024*1024*1024; // 5 gigs, small enough for 64 bits
printf ("%lu\n",sizeof(long long)); // prints 8 (bytes) = 64 bits
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨:
warning: integer overflow in expression [-Woverflow]
Run Code Online (Sandbox Code Playgroud)
为什么会溢出,我错过了什么?
在所有的C++风格指南我看过的,我从来没有看到有关的数值字面后缀(即任何信息3.14f, 0L等等).
问题
是否有任何风格指南可以讨论这些用法,还是有一般惯例?
我偶尔会遇到f图形编程的后缀.在编程域类型中是否存在使用趋势?
从C++ 11标准(草案n3337)§5/ 9:
- 如果两个操作数具有相同的类型,则不需要进一步转换.
- 否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则具有较小整数转换等级类型的操作数应转换为具有较大等级的操作数的类型.
- 否则,如果具有无符号整数类型的操作数的秩 大于或等于另一个操作数的类型的秩,则带有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型.
- 否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数应转换为带有符号整数类型的操作数的类型.
- 否则,两个操作数都应转换为与带有符号整数类型的操作数类型相对应的无符号整数类型.
在这种情况下,等级意味着什么?
当然它不是指std :: rank,
因为它与数组中的维数有关...
就整数类型和浮点类型而言,我认为它指的是它们的潜在大小.
C++标准保证:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
Run Code Online (Sandbox Code Playgroud)
我是否正确地假设当时的等级是:
RankType
1 char
2 short
3 int
4 long
5 long long
...
我无法在任何地方找到描述每种类型等级的列表.
我对这段代码感到困惑:
#include <climits>
#include <iostream>
int main(void) {
using namespace std;
cout << "long max " << LONG_MAX << endl;
long x = 2 * 1024 * 1024 * 1024;
cout << "2 * 1024 * 1024 * 1024 = " << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我本来应该是2147483648,而不是我.使用unsigned似乎没有帮助.是什么赋予了?
long max 9223372036854775807
2 * 1024 * 1024 * 1024 = -2147483648
Run Code Online (Sandbox Code Playgroud) 我有一个简单的c ++应用程序,执行以下计算
long long calcOne = 3 * 100000000; // 3e8, essentially
long long calcTwo = 3 * 1000000000; // 3e9, essentially
long long calcThree = 3 * 10000000000; // 3e10, essentially
Run Code Online (Sandbox Code Playgroud)
如果我写每个计算的结果,我得到以下输出:
calcOne = 300000000
calcTwo = -1294967296
calcThree = 30000000000
Run Code Online (Sandbox Code Playgroud)
那么为什么第二次计算失败呢?据我所知,它在长长型的范围内(calcThree更大......).
我在Windows 10上使用Visual Studio 2015.提前感谢.
为什么下面的代码给出整数溢出警告:
#include <stdio.h>
int main()
{
long long int x = 100000 * 99999;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而下面的代码完美地工作:
#include <stdio.h>
int main()
{
long long int x = 100000000000000;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在C ++ 17草案n4713中遇到了以下代码片段:
#define R "x"
const char* s = R"y"; // ill-formed raw string, not "x" "y"
Run Code Online (Sandbox Code Playgroud)
什么是“原始字符串”?它有什么作用?