Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 5 123 ... CuốiCuối
Kết quả 1 đến 10 của 42
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Bạn nghĩ gì về C so với C++?

    Hello all,

    Tình hình là mình thấy có rất nhiều bạn ở trong diễn đàn mình thích C so với C++. Cái này là vấn đề sở thích, tuy vậy mình lập topic này để các bạn so sánh và tìm ra ngôn ngữ nào thực sự thích hợp với bạn. Qua đó chúng ta có thể có cái nhìn tổng quá hơn về 2 ngôn ngữ rất giống nhau này.

    Câu hỏi:
    1. Tạo sao bạn dùng C/C++ mà không dùng C++/C?
    2. Đặc điểm nào bạn nghĩ C/C++ thực sự thu hút bạn. Ví dụ.
    3. ... ( bạn có thêm bất cứ quan điểm nào mà bạn thích )

    Lưu ý: mình không so sánh performance, vì trong ngôn ngữ không có chuyện ngôn ngữ này nhanh hơn ngôn ngữ khác. Chỉ có cách mà compiler nó hoạt động mới tạo sự khác biệt mà thôi, nhanh hay chậm là do thuật toán của chương trình chứ không phải do ngôn ngữ.
    Và đây là topic thảo luận chứ không phải tranh cãi, và để tránh trở thành language-zealot, chúng ta nên tham gia với mục tiêu học hỏi hơn là dùng quan điểm cá nhân.

  2. #2
    1. Đối với những người mới học: C++ quá mạnh để cho 1 người chưa có hiểu biết gì (hoặc hiểu biết chút ít) sử dụng. Số lượng chức năng mà nó có nhiều nhưng để sử dụng đúng thì phải có cái "tư duy lập trình" trước đã. Và kinh nghiệm của mình cho thấy nhiều người mới vào mà đụng với khái niệm object orienting của C++ là bị "dội" ngay. Tuy nhiên, mặc dù C đơn giản hơn, chỉ hỗ trợ structural programming nhưng nó gần với architecture và không thể coi nó như một hệ thống tính toán hoàn hảo được (các trick về bộ nhớ như dynamic allocation, pointer). Khi đó, bạn sẽ không còn chú ý đến thuật toán mà chỉ còn chú ý đến cách để làm cho chương trình chạy. Một số trường đại học như MIT, UIUC, Portland,... người ta không dạy C hay C++ làm môn học đầu tiên mà dạy một ngôn ngữ scripting như Python hoặc dạy về kiến trúc máy tính và assembly language. -> Ở điểm này, mình nghĩ C = C++ = worst programming languages for beginners ever.

    2. Với người lập trình phần mềm: C++ là số 1. Không phải bàn cãi gì cả. Số lượng thư viện lớn. Có cơ chế template cho phép sử dụng lại mã nguồn. Chi phí maintenance chương trình thấp (lợi điểm của object-oriented programming khi program size and complexity grow).

    3. Với người lập trình nhúng hoặc phần cứng: Số lượng thư viện lớn trước là lợi thế của C++ đối với dân phần mềm lại là ác mộng của dân phần cứng: cực kì khó để port toàn bộ các thư viện của C++. Cho nên mình chỉ thấy các thư viện của C++ dành cho các hệ thông dụng như x86, AMD64, SPARC, ARM, PowerPC, m68k. Và với hệ thống nhúng thì việc thiết kế đơn giản và nhỏ cho nên việc thiết kế firmware theo hướng hướng đối tượng tỏ ra không hiệu quả tí nào. Ok, ở đây thì C > C++

    Ok, mình sử dụng C nhiều hơn, do mình thiết kế phần cứng chứ ko thiết kế phần mềm. Chấm hết :]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @free_wind89:
    - Rất cám ơn bài trả lời rõ ràng và chi tiết của bạn.
    - Tuy nhiên mình thấy có chỗ này bạn so sánh không chính xác lắm.

    Một số trường đại học như MIT, UIUC, Portland,... người ta không dạy C hay C++ làm môn học đầu tiên mà dạy một ngôn ngữ scripting như Python hoặc dạy về kiến trúc máy tính và assembly language. -> Ở điểm này, mình nghĩ C = C++ = worst programming languages for beginners ever.
    Script và các ngôn ngữ dạng C/C++/C#/Java là hai thế hệ khác nhau hoàn toàn khác nhau. Assembly cũng là dạng khác. Cho người mới bắt đầu nếu dùng scipt mình nghĩ sẽ rất khó khăn, vì script hầu hết dùng regular expression. Cụ thể Ruby, Perl, Bash Shell.
    - Nếu bắt đầu lập trình, mình nghĩ bắt đầu từ C/C++ hay Java sẽ dễ dàng hơn.
    - Nói về C và C++:
    1. Có rất nhiều bạn hiểu lầm là C và C++ chỉ khác nhau ở chỗ C++ là OOP. Nhưng thực tế C++ không phải chỉ có OOP, mà đặc điểm nổi bật của nó là các template pattern. Các framework của C++ tại sao tránh virtual đều vì lý do performance. Với template static binding, performance của các C++ libraries tăng một cách đánh kể.
    2. Thứ hai, đúng như bạn free_wind89 nói, C rõ ràng nhỉn hơn trong C++ khi viết nhúng. Nhưng tư duy trong lập trình C++ hoàn toàn có thể dùng cho C, và phải nói là sẽ giúp cho suy nghĩ trong C chính chắn hơn rất nhiều. Cụ thể là từ khóa const, hay cách khai báo biến lúc chỗ bắt đầu chương trình. Các cty điện tử ngày nay tuy viết nhúng cho các phần cứng, vẫn dùng C++ compiler để tránh lỗi này.
    3. Trong C và C++ đều hỗ trợ stack và heap vì vậy điều này rất lợi cho những ai mới vừa bắt đầu học lập trình và muốn tìm hiểu về cách quản lý vùng nhớ.
    4. C không phải không có OOP, nhưng OOP của nó rất rối, cụ thể cả GTK+ framework dùng viết C theo OOP. Và đây là ví dụ của C object:

    Mã:
     #include <glib.h>#include <gdk/gdk.h>#include <gtk/gtkwidget.h>#include <gtk/gtk.h> G_BEGIN_DECLS #define MY_MARQUEE_TYPE            ( my_marquee_get_type() )#define MY_MARQUEE(obj)            ( G_TYPE_CHECK_INSTANCE_CAST( ( obj ), MY_MARQUEE_TYPE, MyMarquee ) )#define MY_MARQUEE_CLASS(klass)    ( G_TYPE_CHECK_CLASS_CAST( ( klass ), MY_MARQUEE_TYPE, MyMarqueeClass ) )#define IS_MY_MARQUEE(obj)         ( G_TYPE_CHECK_INSTANCE_TYPE( ( obj ), MY_MARQUEE_TYPE ) )#define IS_MY_MARQUEE_CLASS(klass) ( G_TYPE_CHECK_CLASS_TYPE( ( klass ), MY_MARQUEE_TYPE ) ) typedef struct _MyMarquee       MyMarquee;typedef struct _MyMarqueeClass  MyMarqueeClass; struct _MyMarquee{    GtkWidget widget;}; struct _MyMarqueeClass{    GtkWidgetClass parent_class;}; GType      my_marquee_get_type( void ) G_GNUC_CONST;GtkWidget* my_marquee_new( void );void       my_marquee_set_message( MyMarquee *marquee, const gchar *message );char*      my_marquee_get_message( MyMarquee *marquee );void       my_marquee_set_speed( MyMarquee *marquee, int speed );gint       my_marquee_get_speed( MyMarquee *marquee ); void my_marquee_slide (MyMarquee *marquee); G_END_DECLS  #define MARQUEE_MIN_WIDTH 300 static void my_marquee_class_init (MyMarqueeClass*);static void my_marquee_init (MyMarquee*);static void my_marquee_get_property (GObject*, guint, GValue*, GParamSpec*);static void my_marquee_set_property (GObject*, guint, const GValue*, GParamSpec*); static void my_marquee_realize (GtkWidget*);static void my_marquee_size_request (GtkWidget*, GtkRequisition*);static void my_marquee_size_allocate (GtkWidget*, GtkAllocation*);static gint my_marquee_expose (GtkWidget*, GdkEventExpose*); #define MY_MARQUEE_GET_PRIVATE( obj ) ( G_TYPE_INSTANCE_GET_PRIVATE( ( obj ), MY_MARQUEE_TYPE, MyMarqueePrivate ) ) typedef struct _MyMarqueePrivate  MyMarqueePrivate; struct _MyMarqueePrivate{    gchar *message;    int speed;    int current_x;}; enum{    PROP_0,    PROP_MESSAGE,    PROP_SPEED}; /* Get a GType that corresponds to MyMarquee. The first time this function is * called (on object instantiation), the type is registered. */GType my_marquee_get_type (){    static GType marquee_type = 0;     if ( !marquee_type )    {        static const GTypeInfo marquee_info =        {            sizeof( MyMarqueeClass ),            NULL,            NULL,            ( GClassInitFunc )my_marquee_class_init,            NULL,            NULL,            sizeof( MyMarquee ),            0,            ( GInstanceInitFunc )my_marquee_init,        };         marquee_type = g_type_register_static( GTK_TYPE_WIDGET,                                               "MyMarquee",                                               &marquee_info,                                               static_cast< GTypeFlags >( 0 ) );    }     return marquee_type;} /* Initialize the MyMarqueeClass class by overriding standard functions, * registering a private class and setting up signals and properties. */static void my_marquee_class_init( MyMarqueeClass *klass ){    GObjectClass *gobject_class;    GtkWidgetClass *widget_class;     gobject_class = ( GObjectClass* ) klass;    widget_class = ( GtkWidgetClass* ) klass;     /* Override the standard functions for setting and retrieving properties. */    gobject_class->set_property = my_marquee_set_property;    gobject_class->get_property = my_marquee_get_property;     /* Override the standard functions for realize, expose, and size changes. */    widget_class->realize = my_marquee_realize;    widget_class->expose_event = my_marquee_expose;    widget_class->size_request = my_marquee_size_request;    widget_class->size_allocate = my_marquee_size_allocate;     /* Add MyMarqueePrivate as a private data class of MyMarqueeClass. */    g_type_class_add_private (klass, sizeof (MyMarqueePrivate));     /* Register four GObject properties, the message and the speed. */    g_object_class_install_property( gobject_class,                                     PROP_MESSAGE,                                     g_param_spec_string( "message",                                                          "Marquee Message",                                                          "The message to scroll",                                                          "",                                                          ( GParamFlags )G_PARAM_READWRITE ) );     g_object_class_install_property( gobject_class,                                     PROP_SPEED,                                     g_param_spec_int( "speed",                                                       "Speed of the Marquee",                                                       "The percentage of movement every second",                                                       1, 50, 25,                                                       ( GParamFlags )G_PARAM_READWRITE ) );} /* Initialize the actual MyMarquee widget. This function is used to setup * the initial view of the widget and set necessary properties. */static void my_marquee_init( MyMarquee *marquee ){    MyMarqueePrivate *priv = MY_MARQUEE_GET_PRIVATE( marquee );     priv->current_x = MARQUEE_MIN_WIDTH;    priv->speed = 25;} /* This function is called when the programmer gives a new value for a widget * property with g_object_set(). */static void my_marquee_set_property( GObject      *object,                                     unsigned      prop_id,                                     const GValue *value,                                     GParamSpec   *pspec ){    MyMarquee *marquee = MY_MARQUEE (object);     switch ( prop_id )    {    case PROP_MESSAGE :        my_marquee_set_message( marquee, g_value_get_string( value ) );        break;     case PROP_SPEED :        my_marquee_set_speed( marquee, g_value_get_int( value ) );        break;     default :        G_OBJECT_WARN_INVALID_PROPERTY_ID( object, prop_id, pspec );        break;    }} /* This function is called when the programmer requests the value of a widget * property with g_object_get(). */static void my_marquee_get_property( GObject    *object,                                     unsigned    prop_id,                                     GValue     *value,                                     GParamSpec *pspec){    MyMarquee *marquee = MY_MARQUEE( object );    MyMarqueePrivate *priv = MY_MARQUEE_GET_PRIVATE( marquee );     switch ( prop_id )    {    case PROP_MESSAGE:        g_value_set_string (value, priv->message);        break;     case PROP_SPEED:        g_value_set_int (value, priv->speed);        break;     default:        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);        break;    }} /* Create and return a new instance of the MyMarquee widget. */GtkWidget* my_marquee_new(){    return GTK_WIDGET( g_object_new( my_marquee_get_type(), NULL ) );} /* Called when the widget is realized. This usually happens when you call * gtk_widget_show() on the widget. */static void my_marquee_realize( GtkWidget *widget ){    MyMarquee     *marquee;    GdkWindowAttr  attributes;    int            attr_mask;     g_return_if_fail( widget != NULL );    g_return_if_fail( IS_MY_MARQUEE( widget ) );     /* Set the GTK_REALIZED flag so it is marked as realized. */    GTK_WIDGET_SET_FLAGS( widget, GTK_REALIZED );    marquee = MY_MARQUEE( widget );     /* Create a new GtkWindowAttr object that will hold info about the GdkWindow. */    attributes.x = widget->allocation.x;    attributes.y = widget->allocation.y;    attributes.width = widget->allocation.width;    attributes.height = widget->allocation.height;    attributes.wclass = GDK_INPUT_OUTPUT;    attributes.window_type = GDK_WINDOW_CHILD;    attributes.event_mask = gtk_widget_get_events (widget);    attributes.event_mask |= ( GDK_EXPOSURE_MASK );    attributes.visual = gtk_widget_get_visual (widget);    attributes.colormap = gtk_widget_get_colormap (widget);     /* Create a new GdkWindow for the widget. */    attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;    widget->window = gdk_window_new( widget->parent->window, &attributes, attr_mask );    gdk_window_set_user_data( widget->window, marquee );     /* Attach a style to the GdkWindow and draw a background color. */    widget->style = gtk_style_attach( widget->style, widget->window );    gtk_style_set_background( widget->style, widget->window, GTK_STATE_NORMAL );    gdk_window_show( widget->window );} /* Handle size requests for the widget. This function forces the widget to have * an initial size set according to the predefined width and the font size. */static void my_marquee_size_request( GtkWidget      *widget,                                     GtkRequisition *requisition ){    PangoFontDescription *fd;     g_return_if_fail( widget != NULL || requisition != NULL );    g_return_if_fail( IS_MY_MARQUEE( widget ) );     fd = widget->style->font_desc;    requisition->width = MARQUEE_MIN_WIDTH;    requisition->height = ( pango_font_description_get_size( fd ) / PANGO_SCALE ) + 10;} /* Handle size allocations for the widget. This does the actual resizing of the * widget to the requested allocation. */static void my_marquee_size_allocate( GtkWidget     *widget,                                      GtkAllocation *allocation){    MyMarquee *marquee;     g_return_if_fail( widget != NULL || allocation != NULL );    g_return_if_fail( IS_MY_MARQUEE( widget ) );     widget->allocation = *allocation;    marquee = MY_MARQUEE( widget );     if ( GTK_WIDGET_REALIZED( widget ) )    {        gdk_window_move_resize( widget->window,                                allocation->x,                                allocation->y,                                allocation->width,                                allocation->height );    }} /* This function is called when an expose-event occurs on the widget. This means * that a part of the widget that was previously hidden is shown. */static int my_marquee_expose( GtkWidget      *widget,                              GdkEventExpose *event ){    PangoFontDescription *fd;    MyMarquee            *marquee;    MyMarqueePrivate     *priv;    PangoLayout          *layout;    PangoContext         *context;    int                   width, height;     g_return_val_if_fail( widget != NULL || event != NULL, FALSE );    g_return_val_if_fail( IS_MY_MARQUEE( widget ), FALSE );     if ( event->count > 0 )        return TRUE;     marquee = MY_MARQUEE( widget );    priv = MY_MARQUEE_GET_PRIVATE( marquee );    fd = widget->style->font_desc;    context = gdk_pango_context_get();    layout = pango_layout_new( context );    g_object_unref( context );     /* Create a new PangoLayout out of the message with the given font. */    pango_layout_set_font_description( layout, fd );    pango_layout_set_text( layout, priv->message, -1 );    pango_layout_get_size( layout, &width, &height );     /* Clear the text from the background of the widget. */    gdk_window_clear_area( widget->window,                           0,                           0,                           widget->allocation.width,                           widget->allocation.height);     /* Draw the PangoLayout on the widget, which is the message text. */    gdk_draw_layout( widget->window,                     widget->style->fg_gc[ widget->state ],                     priv->current_x,                     ( widget->allocation.height - ( height / PANGO_SCALE ) ) / 2,                     layout );     return TRUE;} /* Move the message "speed" pixels to the left or wrap the message around. */void my_marquee_slide( MyMarquee *marquee ){    PangoFontDescription *fd;    GtkWidget            *widget;    MyMarqueePrivate     *priv;    PangoLayout          *layout;    PangoContext         *context;    int                   width, height;     g_return_if_fail( marquee != NULL );    g_return_if_fail( IS_MY_MARQUEE( marquee ) );     widget = GTK_WIDGET( marquee );    priv = MY_MARQUEE_GET_PRIVATE( marquee );    fd = widget->style->font_desc;    context = gdk_pango_context_get();    layout = pango_layout_new( context );    g_object_unref( context );     /* Create a new PangoLayout out of the message with the given font. */    pango_layout_set_font_description( layout, fd );    pango_layout_set_text( layout, priv->message, -1 );    pango_layout_get_size( layout, &width, &height );     /* Clear the text from the background of the widget. */    gdk_window_clear_area( widget->window,                           0,                           0,                           widget->allocation.width,                           widget->allocation.height );     /* Scroll the message "speed" pixels to the left or wrap around. */    priv->current_x = priv->current_x - priv->speed;    if ( ( priv->current_x + ( width / PANGO_SCALE ) ) <= 0 )        priv->current_x = widget->allocation.width;     /* Draw the PangoLayout on the widget, which is the message text. */    gdk_draw_layout( widget->window,                     widget->style->fg_gc[widget->state],                     priv->current_x,                     ( widget->allocation.height - ( height / PANGO_SCALE ) ) / 2,                     layout );} /* Set the message that is displayed by the widget. */void my_marquee_set_message( MyMarquee  *marquee,                             const char *message ){    MyMarqueePrivate *priv = MY_MARQUEE_GET_PRIVATE( marquee );     if ( priv->message )    {        g_free( priv->message );        priv->message = NULL;    }     priv->message = g_strdup( message );} /* Retrieve the message that is displayed by the widget. You must free this * string after you are done using it! */char* my_marquee_get_message( MyMarquee *marquee ){    return g_strdup( MY_MARQUEE_GET_PRIVATE( marquee )->message );} /* Set the number of pixels that the message will scroll. */void my_marquee_set_speed( MyMarquee *marquee,                           int        speed ){    MyMarqueePrivate *priv = MY_MARQUEE_GET_PRIVATE( marquee );    priv->speed = speed;} /* Retrieve the number of pixels that the message will scroll. */int my_marquee_get_speed( MyMarquee *marquee ){    return MY_MARQUEE_GET_PRIVATE( marquee )->speed;}   int main (int argc,          char *argv[]){    GtkWidget *window, *marquee;    PangoFontDescription *fd;     gtk_init( &argc, &argv );     window = gtk_window_new( GTK_WINDOW_TOPLEVEL );    gtk_window_set_title( GTK_WINDOW( window ), "GtkMarquee" );    gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );     g_signal_connect( G_OBJECT( window ),                      "destroy",                      G_CALLBACK( gtk_main_quit ),                      NULL );     fd = pango_font_description_from_string( "Monospace 30" );    marquee = my_marquee_new();    gtk_widget_modify_font( marquee, fd );    my_marquee_set_message( MY_MARQUEE( marquee ), "Wheeeee!" );    my_marquee_set_speed( MY_MARQUEE( marquee ), 10 );    pango_font_description_free( fd );     g_timeout_add( 150, ( GSourceFunc )my_marquee_slide, ( gpointer ) marquee );     gtk_container_add( GTK_CONTAINER( window ), marquee );    gtk_widget_show_all( window );     gtk_main();     return 0;}
    5. C++ hầu như là superset của C, tức là những cái C có thể làm, C++ cũng có thể làm được. Nhưng không có chiều ngược lại.
    6. C++ có thể viết theo nhiều kiểu, chứ không nhất thiết phải dùng STL, tuy vậy STL thực sự hỗ trợ C++ rất nhiều:
    -> C++ có thể viết theo C-style.
    -> C++ có thể viết theo OOP without template và viết theo kiểu này C++ rất giống với Java.
    -> C++ viết theo STL style.
    -> C++ có thể kết hợp cả ba cái nêu trên
    7. Nên học C hay C++ trước? Học C++ trước sẽ hay hơn, vì sao vì 90% C++ bao gồm C.
    8. Và ngày nay, bạn không thể thấy được sự khác nhau nhiều về tốc độ khi biên dịch C và C++, vì 99% các compiler đều cho biên dịch C và C++.
    9. C++ thực sự rất phức tạp, và tìm một C++ expert sẽ khó hơn rất nhiều so với tìm một C expert. Đó là thực tế, và có rất nhiều cty khi mà họ không tìm được tiếng nói chung giữa hai trường phái này, sẽ dẫn đến lệch lạc giữa trong coding style, không nhất quán được.
    10. Một article khá hay về C và C++: http://unthought.net/c++/c_vs_c++.html

  4. #4
    Mình nghĩ trong diễn đàn này nhiều người quan tâm C# hơn cả ấy, hi.C++ chắc chắn bao hàm cả C rùi, vì vậy nếu nói đúng thì học C++ thì cũng như học C rùi(nếu học trọn vẹn).Nếu trong C++ không dùng cout, cin , new, mà dùng printf,scanf, malloc thì nó ra giống C rùi. Ngoại trừ OPP và những template hướng đối tượng thì mình vẫn chưa thấy hết sự khác biệt gì lớn. Nhưng học C# thì lại là chuyện khác, nó bỏ nhiều thứ của C++ và xây dựng thêm quá nhiều thứ.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @TrangKhuyet:

    Nhưng học C# thì lại là chuyện khác, nó bỏ nhiều thứ của C++ và xây dựng thêm quá nhiều thứ.
    Theo mình C# dùng rất nhiều thứ từ C++, nó chỉ che dấu lại thôi, chứ không hẳn nó hoàn toàn mới.
    Ví dụ default parameter là cái mà version 4.0 nó support, và cái này nó mang từ C++ qua.
    Delegate thì cũng là functor bên C++. Template của C# tuy có khác nhưng rõ ràng phiên bản đầu của nó không hề có template, nhưng sau version 2.0 thì nó chuyển sang support template.
    Những cái khác biệt giữa C# và C++:
    1. Garbage Collector
    2. Reference Type và Value Type ( class & struct )
    3. Mọi thứ đều inherit từ Object class
    4. Không hỗ trợ multiple inheritance
    5. Property: get, set

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Theo cá nhân Kevin, so sánh thì khó nói, nhưng nếu nghĩ thì Kevin nghĩ như sau:

    Tại sao các hệ điều hành phổ biến hiện nay(Windows, *Nix), các ngôn ngữ lập trình phổ biến hiện nay (Java, PHP, ...) đều phát triển từ C chứ không phải là C++. Tại sao?

    Kevin không có sự phân biệt giữa C và C++, đứng trước một quyết định có thể ngốn đi hàng tỉ đồng, quyết định của Kevin chắc chắn sẽ là cái nào phù hợp, hiệu quả và tốn ít thời gian nhất cho vấn đề đang nghĩ. Nhưng thường thì Kevin quyết định sử dụng C++ ở mức Application, còn C ở mức hệ thống.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi rox_rook
    @TrangKhuyet:

    Theo mình C# dùng rất nhiều thứ từ C++, nó chỉ che dấu lại thôi, chứ không hẳn nó hoàn toàn mới.
    Ừ, những cái thứ nó giấu lại làm người nếu không học từ C++ lên sẽ khó mà biết, giống như window form vậy tạo 1 form C# quá dễ dàng nhưng nếu học C++ sẽ biết nó khó khăn vô cùng lắm, con trỏ cũng vậy, trong C++ làm việc với con trỏ nổi điên vô cùng lên C# thì gần như quên nó đi.
    Nói chung mình cũng không thể so sánh đươc nữa, chỉ biết nôm na vài cái khác trong quá trình code thôi.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Trangkhuyet
    Mình nghĩ trong diễn đàn này nhiều người quan tâm C# hơn cả ấy, hi.C++ chắc chắn bao hàm cả C rùi, vì vậy nếu nói đúng thì học C++ thì cũng như học C rùi(nếu học trọn vẹn).Nếu trong C++ không dùng cout, cin , new, mà dùng printf,scanf, malloc thì nó ra giống C rùi. Ngoại trừ OPP và những template hướng đối tượng thì mình vẫn chưa thấy hết sự khác biệt gì lớn. Nhưng học C# thì lại là chuyện khác, nó bỏ nhiều thứ của C++ và xây dựng thêm quá nhiều thứ.
    Cùng quan điểm với bạn.

    Trích dẫn Gửi bởi rox_rook
    @TrangKhuyet:

    Theo mình C# dùng rất nhiều thứ từ C++, nó chỉ che dấu lại thôi, chứ không hẳn nó hoàn toàn mới.
    Ví dụ default parameter là cái mà version 4.0 nó support, và cái này nó mang từ C++ qua.
    Delegate thì cũng là functor bên C++. Template của C# tuy có khác nhưng rõ ràng phiên bản đầu của nó không hề có template, nhưng sau version 2.0 thì nó chuyển sang support template.
    Những cái khác biệt giữa C# và C++:
    1. Garbage Collector
    2. Reference Type và Value Type ( class & struct )
    3. Mọi thứ đều inherit từ Object class
    4. Không hỗ trợ multiple inheritance
    5. Property: get, set
    Mình đọc đựoc ở đâu đó rằng: Microsoft đã gom những tinh túy có được từ các ngôn ngữ đã có thành C#.

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Các pro nói làm em khó xử quá. Em mới học qua loa C nhưng giờ lại phải học C++. Mà sau này công việc của em thì chủ yếu là lập trình phần cứng. Chắc phải học kỹ thêm C thôi. C++ tuy có nhiều cải tiến hơn C nhưng vẫn là đứa con đẻ của C thôi. [IMG]images/smilies/smile.png[/IMG])
    Mà rõ rằng C/C++ đã quá phổ biến và dường như không thể thay thế.
    Vậy rõ ràng ngôn ngữ này đã quá thành công
    Do vậy 2 cha con họ đã có một vị trí đáng kể so với các anh em họ hàng khác
    Mà các cụ đã nói con hơn cha là nhà có phúc
    Tóm lại phần lớn thì C > C++. Nhưng ở một vài điểm nào đó C vẫn kinh nghiệm và bản lĩnh hơn C++.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @all:
    Mình để ý thấy không ai đọc cái link cuối của mình đưa hết. Đó là một article rất hay và sâu sắc về C++ so với C.
    Ai cũng nghĩ system programming cần performance, C is fast. C chỉ gọn chứ không hề nhanh hơn. Nhưng tới lúc nó phình ra, thì nhìn code chỉ có đọc bằng niềm tin. Vì vậy các tasks của C thường chỉ nằm gọn trong vài hàm và ít có sự phụ thuộc, nên nó sẽ chỉ thích hợp cho:
    - Viết Test cho mấy device
    - Viết những task nhỏ, etc
    Có người nói rằng Windows và Linux được viết bằng C, và nó sẽ được viết nhanh hơn gấp nhiều lần nếu được viết lại bằng C++. Cái chính là những cái có rồi thì không ai rảnh để chuyển code lại hết.

 

 
Trang 1 của 5 123 ... CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •