小编Des*_*tor的帖子

使用未知转义序列是否会调用 C++ 中未定义的行为?

考虑以下程序:

#include <iostream>
int main()
{
     std::cout<<"Can this lead to undefined behavior?"<<'\s';
}
Run Code Online (Sandbox Code Playgroud)

g++ 给出警告:

[Warning] unknown escape sequence: '\s' [enabled by default]
Run Code Online (Sandbox Code Playgroud)

这里'\s'不小心输入了,而不是'\n'。那么,这个程序是明确定义的还是未定义的?C++ 标准对此有何规定?K&R 的 C 编程语言说这是 C 中未定义的行为。

c++ special-characters undefined-behavior

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

为什么name()函数返回的字符串是实现定义的?

考虑以下示例:

#include <iostream>
#include <typeinfo>
int main()
{
    int a=9;
    std::cout << typeid(a).name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.8.1上的输出:i

MSVS 2010上的输出:int

为什么输出是编译器依赖?这背后的原因是什么?为什么它被保留为实现定义?为什么在所有编译器上没有相同的输出?C++标准是否明确地说明了这一点?

c++ rtti typeid

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

在C++中,sizeof空枚举的大小是4?

考虑以下程序(请参阅此处的实时演示)

#include <iostream>
int main()
{
    enum days{}d;
    std::cout<<sizeof(d);
}
Run Code Online (Sandbox Code Playgroud)

在使用g ++ 4.8.1进行编译时,它在本地计算机上打印4作为输出.它如何在这里占用4个字节?在给定链接中的gcc 6.0上,我也使用了`-pedantic-option,但它编译得很好.

那么为什么它不允许在C?我在gcc 4.8.1中尝试了以下程序.(在这里查看现场演示)

#include <stdio.h>
int main(void)
{
    enum days{}d;
    printf("sizeof enum is %u",sizeof(d));
}
Run Code Online (Sandbox Code Playgroud)

编译器给出以下错误:

4   12  [Error] expected identifier before '}' token

5   36  [Error] 'd' undeclared (first use in this function)

5   36  [Note] each undeclared identifier is reported only once for each function it appears in
Run Code Online (Sandbox Code Playgroud)

是否允许在C++中使用空枚举但在C中不允许使用空枚举?

c c++ enums gcc

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

在C89和C++中用空参数调用宏真的是未定义的行为吗?

考虑以下计划:

#include <iostream>
#define add(s,m,a)  ( s + m + a + 0 )
int main()
{
    std::cout<<add(3,4,5)<<'\n';
    std::cout<<add(15,30,)<<'\n';
    std::cout<<add(10, , 33)<<'\n';
    std::cout<<add(10,,)<<'\n';
    std::cout<<add(,,)<<'\n';   
}
Run Code Online (Sandbox Code Playgroud)

我的编译器gcc 4.8.1给出以下警告:

6   23 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

7   25 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

8   21 [Warning] invoking macro add argument 2: empty …
Run Code Online (Sandbox Code Playgroud)

c c++ macros c89 c++98

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

在指针初始化中使用一元加运算符有什么用?

我知道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不允许?

c arrays pointers unary-operator

3
推荐指数
2
解决办法
770
查看次数

如何不指定函数参数的精确评估顺序有助于C&C++编译器生成优化代码?

#include <iostream>
int foo() {
    std::cout<<"foo() is called\n";
    return 9;
}
int bar() {
    std::cout<<"bar() is called\n";
    return 18;
}
int main() {
    std::cout<<foo()<<' '<<bar()<<' '<<'\n';
}
// Above program's behaviour is unspecified
// clang++ evaluates function arguments from left to right: http://melpon.org/wandbox/permlink/STnvMm1YVrrSRSsB
// g++ & MSVC++ evaluates function arguments from right to left
// so either foo() or bar() can be called first depending upon compiler.
Run Code Online (Sandbox Code Playgroud)

上述程序的输出取决于编译器.未指定评估函数参数的顺序.我读到这个的原因是它可以导致高度优化的代码.如何不指定函数参数的精确评估顺序有助于编译器生成优化代码

AFAIK,评估顺序严格按Java,C#,D等语言规定.

c++ optimization operator-precedence compiler-optimization unspecified-behavior

3
推荐指数
3
解决办法
211
查看次数

使用C中的scanf()连续读取两个字符

我试图从用户输入两个字符t.这是我的代码:

int main()
{
    int t;
    scanf("%d",&t);
    char a,b;

    for(i=0; i<t; i++)
    {
        printf("enter a: ");
        scanf("%c",&a);

        printf("enter b:");
        scanf("%c",&b);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,第一次输出是:

enter a: 
enter b:
Run Code Online (Sandbox Code Playgroud)

也就是说,代码不等待值a.

c input scanf character input-buffer

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

c语言中的隐式int

我正在使用orwell dev c ++ IDE.我知道在旧的C89标准和预标准中,当函数定义中没有明确指定函数的返回类型时,C++支持缺省为int规则.但它已在C++中被禁止.但最近我写了以下简单的C程序,它工作正常.

#include <stdio.h>
void fun();
int main(void)
{
    int a=9;
    printf("%d",a);
    printf("%d",a);
    fun();
    return 0;
}
a=1;
void fun()
{
    printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)

默认的int规则是否也适用于变量?我的编译器向我显示以下警告.

[Warning] data definition has no type or storage class [enabled by default] 

[Warning] type defaults to 'int' in declaration of 'a' [enabled by default]
Run Code Online (Sandbox Code Playgroud)

为什么C99标准仍允许默认为int?它在C++中编译失败.如果我错了,请纠正我?此C程序也适用于ideone.com等在线编译器

c variables

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

新的运算符分配函数顺序连续性和初始值

C++标准第3.7.3.1节说明了这一点

"未指定连续调用分配函数分配的存储的顺序,连续性和初始值."

订单和邻接是什么意思?为什么没有说明?为什么初始值也未指定?

c++ new-operator dynamic-memory-allocation

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

c ++使用匿名对象调用函数会导致编译器错误

为什么以下程序在编译时失败.

#include <iostream>
using namespace std;
class Test
{
    public:
    void fun()
    {
        cout<<"fun() in Test\n";
    }
};
int main() {
    new Test()->fun();
    // your code goes here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

访问此链接:http://ideone.com/qtCufW

允许在Java和C#中使用匿名对象调用成员方法,但为什么不允许在C++中使用?请帮我.

c++ new-operator

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