我对C++非常陌生,但我觉得auto的这种行为很奇怪:
class A{};
int main() {
A a;
auto x = -(sizeof(a));
cout << x << endl;
return 0;
}
变量x在本例中是unsigned,尽管我在变量初始化时使用了一元减号运算符。为什么只考虑sizeof (std::size_t)的返回类型,而不考虑存储的数字由于使用的运算符而为负值这一事实?
我知道size_t是一个未签名的int。
我已经用GCC 8.1.0和C++17试过了。
有人能澄清为什么这是合法的C++代码吗?(是的,我在问我的代码为什么工作;)
#include <iostream>
#include <vector>
int main()
{
const std::size_t N = 10;
int a[N]{}; // value-initialize it to get rid of annoying un-initialized warnings in the following line
std::cout << a[5] << std::endl; // got a
我试图用GCC 6编译一些相当简单的C++代码,但是得到了一个缩小转换警告。这是有问题的,因为我们将警告视为错误。
struct S {
short int a;
short int b;
};
short int getFoo();
short int getBar();
std::array<S, 2> arr = {{
{5, getFoo()},
{3, getFoo() + getBar()} // Narrowing conversion here?
}};
您可以在上看到这段代码正在运行。GCC说,getFoo() + getB
示例
int main()
{
const int i = 1.0; // Notice I am assigning a double to an int here
char a[i];
}
问题
使用g++ -O0 -Wall -pedantic -ansi -std=c++11编译上述代码不会产生任何错误(除了一个未使用的变量)。但是,如果删除-std=c++11,则会收到以下警告:
警告: ISO C++禁止可变长度数组
根据,我认为在C++03中,代码是无效的。但是,有人能解释一下C++11中的规则是如何变化的吗?
(这个问题是我回答的的结果。)
我有一个问题,因为这个工作适用于许多函数,但当我试图绘制正弦的积分时(我正在使用matlab 2010),我遇到了麻烦:
clear all
close all
clc
x = linspace(-10, 10, 100);
f = @(x) sin(x);
I = arrayfun(@(x) quad(f, 0, x), x);
plot(x, f(x),'r', x, I, 'b')
我希望有一个-cos(x),但是我得到了偏移量为1的东西,为什么会发生这种情况?该如何解决这个问题呢?
以下(诚然是人为的)C程序无法编译:
int main() {
const int array[] = {1,2,3};
static int x = array[1];
}
在使用gcc (或微软的CL.EXE)编译上面的C源文件时,我得到以下错误:
error: initializer element is not constant
static int x = array[1];
^
这样简单直观的语法当然是有用的,所以这看起来应该是合法的,但显然不是。当然,我不是唯一一个对这个明显愚蠢的限制感到沮丧的人。我不明白为什么这是不允许的--C语言试图通过使这个有
为什么两个unsigned short类型的int在C++中的除法结果?我已经创建了一个很容易在例如中测试的例子
// Example program
#include <iostream>
#include <string>
#include <typeinfo>
int main(){
unsigned short a = 1;
unsigned short b = 1;
auto c = a/b;
std::cout<<"result of dividing unsigned shorts is: "&l
我已经搜索了一个小时的方法进行数值积分。我是Rcpp的新手,现在正在重写我的旧程序。我在R中所做的是:
x=smpl.x(n,theta.true)
joint=function(theta){# the joint dist for
#all random variable
d=c()
for(i in 1:n){
d[i]=den(x[i],theta)
}
return(prod(d)*dbeta(theta,a,b)) }
joint.vec=Vector
我在读 A C++之旅。在第9页,他说:
“数组的大小必须是一个常量表达式。”
但后来,在pg上。16 .他使用以下代码示例:
void vector vector_init(Vector& v, int s)
{
v.elem = new double[s]; // Allocate an array of s doubles
v.sz = s;
}
这里s不是一个常量表达式,那么如何将v.elem初始化为new double[s]是合法的呢?
请检查以下片段:
unsigned char a = 100;
unsigned char b = 100;
unsigned char c = 100;
unsigned short x = a * b + c;
我预计这将溢出,计算将以8位类型的无符号字符(而不是在16位无符号短),超过无符号字符的值范围。但事实并非如此。
为什么计算在C和C++中不溢出?
在visual C++ 2010中,当编译以下代码时,我收到错误消息:
static_cast错误C2057:应为常量表达式。
这有什么问题吗?
struct A {};
struct B : A {};
struct XX
{
static const int offset = (long)static_cast<A*>((B*)0x8) - 0x8;
};
感谢AProgrammer,以下内容适用于VC2010:
struct A {};
struct B : A {};
struct XX
{
static const int offset;
};
co
可能重复:
请看这段代码
#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}
在我的书中写到,array_size必须是一个常量,但是代码块并没有给出错误。
这不是唯一的情况..。还有其他几个例子。
谁错了IDE、编译器或其他任何东西?
用更新的或旧的书会引起这样的问题吗??