小编Des*_*ard的帖子

如何在while循环中评估"std :: cin >> value"?

目前我正在自学C++ Primer 5th.这是我不确定的事情.(我在FAQ上找不到确切的相关问题).

考虑这个while循环:

while(std::cin>>value){...}  \\value here was defined as int. 
Run Code Online (Sandbox Code Playgroud)

教科书上写道:

该表达式从标准输入中读取下一个数字,并将该数字存储在值中.输入运算符(第1.2节,第8页)返回其左操作数,在本例中为std :: cin.因此,这个条件测试std :: cin.当我们使用istream作为条件时,效果是测试流的状态.如果流是有效的 - 也就是说,如果流没有遇到错误 - 则测试成功.

我的问题是:首先std::cin读入输入value然后测试验证std::cin,或std::cin首先测试然后决定是否读入'值'?当它"返回它的左操作数"时,我很困惑.

c++ cin operator-precedence

5
推荐指数
1
解决办法
4375
查看次数

列表初始化的缩小转换是错误还是警告?

目前我正在自学 C++ 入门第 5 版。文中说:

当与内置类型的变量一起使用时,这种初始化形式有一个重要的特性:如果初始化程序可能导致信息丢失,编译器不会让我们列出内置类型的初始化变量:

这是示例代码:

long double ld = 3.1415926536;
int a{ld}, b = {ld}; // error: narrowing conversion required
int c(ld), d = ld; // ok: but value will be truncated
Run Code Online (Sandbox Code Playgroud)

但是当我自己在 C++shell 上尝试时:

long double a=3.14159265354;
 int b(a);
 int c{a};
 std::cout<<a<<std::endl<<b<<std::endl<<c<<std::endl;
Run Code Online (Sandbox Code Playgroud)

它只是发出警告,-Wnarrowing但程序已成功执行。为什么?

c++ implicit-conversion

5
推荐指数
1
解决办法
262
查看次数

const引用如何绑定到右值

我看过很多关于绑定const引用到rvalue的FAQ帖子.有人说这是因为系统生成一个临时对象供参考绑定,有些人说它只是一个抽象的系统规则,它可能并没有真正做到这一点.那么我应该遵循哪一方?有人可以解释将const引用绑定到右值的真正机制,或者只是简单地找到一个相关的并确认准确的链接.提前谢谢了!!

c++ reference

2
推荐指数
1
解决办法
114
查看次数

为什么必须在基于范围的for循环中使用引用

我被困在C++ Primer中的一段代码中并且已经考虑了超过1小时.代码是

for (auto row : ia)//should use &row here
   for (auto col : row)
Run Code Online (Sandbox Code Playgroud)

对它的解释是

我们这样做是为了避免正常的数组转换为指针.因为row不是引用,所以当编译器初始化row时,它会将每个数组元素(与数组类型的任何其他对象一样)转换为指向该数组的第一个元素的指针.因此,在此循环中,行的类型为int*.内部for循环是非法的.尽管我们有意图,但该循环尝试迭代int*.

我知道每次做迭代都与迭代有关for(auto col:row).我无法理解的

我们这样做是为了避免正常的数组到指针转换"

是什么是我们为外循环传入的"ia"的形式?它应该是指向其第一个元素的地址而不是"具体"数组的指针吗?那么内循环有什么不对?我认为它应该是与外循环相同的机制..我无法理解Q&A上的帖子.请有人赐教......我的理解有什么不对......也欢迎一个好的链接!提前谢谢了!

ia的声明是

constexpr size_t rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt]; // 12 uninitialized elements
// for each row
  for (size_t i = 0; i != rowCnt; ++i) {
// for each column within the row
    for (size_t j = 0; j != colCnt; ++j) {
// assign the element's positional index as its value
        ia[i][j] = …
Run Code Online (Sandbox Code Playgroud)

c++ arrays loops

2
推荐指数
1
解决办法
142
查看次数

结束是否刷新缓冲区

目前我正在自学C++.
C++入门说:

cout << "hi!" << ends; //writes hi and a null, then flushes the buffer
Run Code Online (Sandbox Code Playgroud)

但是C++标准库第二版说:

ends: Outputs '\0'
Run Code Online (Sandbox Code Playgroud)

而cplusplus上的引用也没有提到刷新缓冲区.
那么我应该遵循哪一个?

c++ io

2
推荐指数
1
解决办法
40
查看次数

这是数组初始化吗?

int ia[] = {0,1,2,3,4,5,6,7,8,9}; // ia is an array of ten ints
auto ia2(ia); // ia2 is an int* that points to the first element in ia
ia2 = 42;     // error: ia2 is a pointer, and we can't assign an int to a pointer
Run Code Online (Sandbox Code Playgroud)

这是关于C++ Primer的一段代码.有人可以向我解释第二行是什么意思.这是一种初始化方式吗?我在哪里可以找到这种初始化?我搜索了很多但仍然无法获得相关信息.也欢迎链接.非常感谢!

c++ arrays

1
推荐指数
1
解决办法
69
查看次数