相关疑难解决方法(0)

C++ 17引入了哪些评估顺序保证?

在典型的C++代码中,C++ 17评估顺序保证(P0145)投票的含义是什么?

对于像这样的事情,它有什么变化

i=1;
f(i++, i)
Run Code Online (Sandbox Code Playgroud)

std::cout << f() << f() << f() ;
Run Code Online (Sandbox Code Playgroud)

要么

f(g(),h(),j());
Run Code Online (Sandbox Code Playgroud)

c++ operator-precedence c++17

77
推荐指数
2
解决办法
7130
查看次数

这段代码是否定义明确?

此代码取自此处的讨论.

someInstance.Fun(++k).Gun(10).Sun(k).Tun();
Run Code Online (Sandbox Code Playgroud)

这段代码是否定义明确?是否++kkSun()之前评估过Fun ()?

如果k是用户定义的类型,而不是内置类型怎么办?以上函数调用顺序的方式与此不同:

eat(++k);drink(10);sleep(k);
Run Code Online (Sandbox Code Playgroud)

据我所知,在这两种情况下,每个函数调用后都存在一个序列点.如果是这样,为什么第一个案例也不能像第二个案例那样明确定义?

C++ ISO标准的1.9.17部分对序列点和功能评估进行了说明:

在调用函数时(无论函数是否为内联函数),在评估函数体中任何表达式或语句之前发生的所有函数参数(如果有) 之后,都会有 一个序列点.在复制返回值之后和执行函数外部的任何表达式之前,还有一个 序列点.

c++ operator-precedence sequence-points

27
推荐指数
4
解决办法
1758
查看次数

运算符优先级

可能重复:
cout <<它打印的函数调用顺序?
未定义的行为和序列点

为什么这段代码打印2 1 0?

#include <iostream>
struct A{
  int p;
  A():p(0){}
  int get(){
    return p++;
  }
};


int main(){
 A a;
 std::cout<<a.get()<<" "<<a.get()<<" "<<a.get()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ operators

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

C++中链调用的评估顺序

假设我们上课了A:

class A {
public:
    A& func1( int ) { return *this; }
    A& func2( int ) { return *this; }
};
Run Code Online (Sandbox Code Playgroud)

和2个立场功能:

int func3();
int func4();
Run Code Online (Sandbox Code Playgroud)

现在在这段代码中:

A a;
a.func1( func3() ).func2( func4() );
Run Code Online (Sandbox Code Playgroud)

是功能评估的顺序func3()func4()定义?

根据这个答案未定义的行为和序列点之一的序列点是:

  • 在函数体(§1.9/17)中执行任何表达式或语句之前发生的所有函数参数(如果有)的评估之后,在函数调用(函数是否为内联函数)之后.

那么"所有函数参数的评估"是什么意思,func3()必须先调用,func4()因为func1()参数的评估必须在调用之前发生func2()

c++ operator-precedence

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

int c = 0的结果; COUT << C++ <<℃;

我认为它应该是01,但有人说它"未定义",有什么理由吗?

c++ ostream

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

cout消息的顺序不符合预期

我执行它时,我对下面代码的输出感到困惑.

码:

int add(int a, int b)
{
    cout<<"inside int add function"<<endl;
    return a+b;
}

float add(float a, float b)
{
    cout<<"inside float add function"<<endl;
    return a+b;
}

int main()
{
    cout<<add(10.0f,20.0f)<<endl<<add(20,50); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

inside int add function
inside float add function
30
70
Run Code Online (Sandbox Code Playgroud)

我不明白cout消息的顺序是在控制台中打印出来的.但我预计上面的程序输出如下

inside float add function
30
inside int add function
70
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下上述行为.

c++

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

不同编译器的执行顺序不同

此代码在 XCode 和 Visual Studio 中提供不同的输出:

#include <iostream>

using namespace std;

int f() {
    cout << 'A';
    return 1;
}

int main() {
    cout << '.' << f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 中它输出

A.1
Run Code Online (Sandbox Code Playgroud)

在 XCode 中它输出

.A1
Run Code Online (Sandbox Code Playgroud)

显然我希望两个编译器输出相同的东西..是否应该不这样做?这是已知的事情还是我可以对此做些什么?

c++ order-of-execution

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

cout vs printf - 执行顺序

可能重复:
编译器和C++中的评估参数顺序
cout <<它打印的函数调用顺序?

  1. 这个:

    int k=3;
    printf("%d %d %d",k++,k,++k);
    
    Run Code Online (Sandbox Code Playgroud)

    提供输出,4 4 4因为它们被推入堆栈中:

    %d%d%d
    
    4  -- for k++    
    4  --for k    
    4  --for ++k
    
    Run Code Online (Sandbox Code Playgroud)

    对?

  2. 这个:

    int k = 3;
    cout << k++ << k << ++k;
    
    Run Code Online (Sandbox Code Playgroud)

    实际上是重复的函数调用,所以它相当于:

    ( ( (cout << k++) << k) << ++k);
    
    Run Code Online (Sandbox Code Playgroud)

    所以,我认为首先是k++k然后++k必须按以下顺序执行的,对不对?我相信函数调用是一个序列点,但输出在不同的实现上有所不同.为什么会这样?

c c++

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

C++ - 在返回int的函数中通过引用传递参数

我创建了一个C++程序,以测试通过函数引用传递参数的功能.

#include <iostream>

using namespace std;

int f(int &b) {
    b = b + 1;
    cout << b << endl;
    return b;
}

int main() {
    int t = 10;

    cout << f(t) << " " << t << endl;
    //cout << f(&t) << " " << t << endl;

    system("PAUSE");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

能否请您解释为什么这个程序不会影响t执行f函数后的值?b传递的参数是引用,所以我认为它的值会在程序执行后发生变化,因为我正在使用main函数中的实际变量,而不是它的副本.在这种情况下,我希望它是11,但它不受程序执行的影响.

为什么会这样?

c++ pass-by-reference

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

使用std :: cout时的反向顺序

下面的程序输出10.我希望它首先打印0(函数f的else分支)然后打印1.为什么订单被颠倒?

#include <iostream>     
using namespace std;

int f(bool& b){
    if (b==true){
        return 1;
    } else {
        b=true;
        return 0;
    }
}

int main () {
    bool b=false;
    cout<<unitbuf<<f(b)<<unitbuf<<f(b);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出

10
Run Code Online (Sandbox Code Playgroud)

c++ cout

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

std :: cout语句评估顺序

pop()函数有什么问题,为什么它不能正常工作?

class stack{
    int *p, *Cursor;
    int size ;
public:
    stack(int sz) {Cursor = p = new int[size=sz+1];} //consider the stack empty when its size is 1
    ~stack() {delete[] p;} //Cursor and P will be destroyed when the program finishes
    void push(int x) {Cursor+=1; *Cursor=x; size++;}
    int pop() {if(Cursor == p) return -1; int temp = *Cursor; Cursor--; size--; return (temp);}
    bool isEmpty(){return(Cursor == p);}
    bool isFull(){return(Cursor == p+size);}
};
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

stack A(3);
    std::cout<<"Empty: "<<A.isEmpty()<<std::endl;
    std::cout<<"Full: "<<A.isFull()<<std::endl;
    A.push(10);
    A.push(20);
    A.push(30); …
Run Code Online (Sandbox Code Playgroud)

c++ stack

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

为什么在同一行上有2个函数调用时会跳过函数调用?

我很困惑为什么这条线:

cout << "Your average in this course is " << average() << " and your letter grade is " << convert_to_letterGrade() << "\n";
Run Code Online (Sandbox Code Playgroud)

不起作用,而以下工作(一个cout分为2):

cout << "Your average in this course is " << average();
cout << << " and your letter grade is " << convert_to_letterGrade() << "\n";
Run Code Online (Sandbox Code Playgroud)

此代码位于void函数中,该函数是类的公共成员Grades.average()计算并将结果存储在私有成员变量中averageScore,并返回averageScore.如果平均分数不合理,则convert_to_letterGrade()返回char基于值averageScore和错误消息的值,并且这两个函数都是类的私有成员.

在第一种情况下,我从convert_to_letterGrade()第一个开始收到错误消息,然后是cout语句应该打印的内容.该cout语句打印正确的averageScore值,但当我进入时convert_to_letterGrade(),该函数仍然使用垃圾值averageScore,而第二个工作完全正常,convert_to_letterGrade()也使用正确的 …

c++

-2
推荐指数
2
解决办法
92
查看次数