{"id":83,"date":"2007-09-19T02:31:44","date_gmt":"2007-09-19T07:31:44","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=83"},"modified":"2007-09-19T03:05:43","modified_gmt":"2007-09-19T08:05:43","slug":"beware-of-sequence-points","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/","title":{"rendered":"Beware of Sequence Points"},"content":{"rendered":"<p>Consider the following C++ code:<\/p>\n<pre class=\"prettyprint\">\r\nvoid foo(int a, int b, int c) \r\n{ \r\n   std::cout &lt;&lt; a &lt;&lt; ' ' &lt;&lt; b &lt;&lt; ' ' &lt;&lt; c &lt;&lt; std::endl; \r\n}   \r\n\r\nint main(int argc, char* argv[]) \r\n{ \r\n   int value = 1; \r\n   foo(value++, value++, value++);   \r\n\r\n   return 0; \r\n}<\/pre>\n<p>That looks pretty straight-forward: there is a function that takes three integer arguments and prints them to the console. In main, it is called by incrementing a variable three times. You would expect that the output was 1 2 3. But surprise: it is 3 2 1 in a debug build and 1 1 1 in a release build (Visual Studio 2005 and Visual Studio 2008). Why? Because it writes multiple times to the same memory location between two sequence points, which is undefined behavior (and I know somebody that always stresses that undefined behavior is spelled W-R-O-N-G).<\/p>\n<p>A sequence point is a point in the execution of the program where all side effects from previous evaluation have been performed and no side effects from subsequent evaluation have been performed. Between two consecutive sequence points an object&#8217;s value can be modified only once by an expression. The function call operator is such a sequence point, but the order of arguments evaluations is not specified (unlike Java or C# where is always performed from left to right). Thus, modifying a variable multiple times in calling a function introduces undefined behavior.<\/p>\n<p>Using the \/RTCu (Run-time error checks) compiler option in the debug build produces different machine code and order of evaluation.<\/p>\n<p>At machine code level, the code for main in the debug build looks like this:<\/p>\n<pre class=\"prettyprint\">\r\n; 34   :    \r\n\r\n\tmov\tDWORD PTR _value$[ebp], 1   \r\n\r\n; 35   :    \r\n\r\n\tmov\teax, DWORD PTR _value$[ebp] \r\n\tmov\tDWORD PTR tv65[ebp], eax \r\n\tmov\tecx, DWORD PTR _value$[ebp] \r\n\tadd\tecx, 1   \r\n\r\n\tmov\tDWORD PTR _value$[ebp], ecx \r\n\tmov\tedx, DWORD PTR _value$[ebp] \r\n\tmov\tDWORD PTR tv68[ebp], edx \r\n\tmov\teax, DWORD PTR _value$[ebp] \r\n\tadd\teax, 1   \r\n\r\n\tmov\tDWORD PTR _value$[ebp], eax \r\n\tmov\tecx, DWORD PTR _value$[ebp] \r\n\tmov\tDWORD PTR tv71[ebp], ecx \r\n\tmov\tedx, DWORD PTR _value$[ebp] \r\n\tadd\tedx, 1   \r\n\r\n\tmov\tDWORD PTR _value$[ebp], edx \r\n\tmov\teax, DWORD PTR tv65[ebp] \r\n\tpush\teax \r\n\tmov\tecx, DWORD PTR tv68[ebp] \r\n\tpush\tecx \r\n\tmov\tedx, DWORD PTR tv71[ebp] \r\n\tpush\tedx \r\n\tcall\t?foo@@YAXHHH@Z\t\t\t\t; foo \r\n\tadd\tesp, 12\t\t\t\t\t; 0000000cH<\/pre>\n<p>and in the release build (or without \/RTCu):<\/p>\n<pre class=\"prettyprint\">\r\n; 34   :    \r\n\r\n\tmov\tDWORD PTR _value$[ebp], 1   \r\n\r\n; 35   :    \r\n\r\n\tmov\teax, DWORD PTR _value$[ebp] \r\n\tmov\tDWORD PTR tv65[ebp], eax   \r\n\r\n\tmov\tecx, DWORD PTR _value$[ebp] \r\n\tmov\tDWORD PTR tv68[ebp], ecx   \r\n\r\n\tmov\tedx, DWORD PTR _value$[ebp] \r\n\tmov\tDWORD PTR tv71[ebp], edx   \r\n\r\n\tmov\teax, DWORD PTR tv65[ebp] \r\n\tpush\teax \r\n\tmov\tecx, DWORD PTR tv68[ebp] \r\n\tpush\tecx \r\n\tmov\tedx, DWORD PTR tv71[ebp] \r\n\tpush\tedx \r\n\tcall\t?foo@@YAXHHH@Z\t\t\t\t; foo \r\n\tadd\tesp, 12\t\t\t\t\t; 0000000cH   \r\n\r\n\tmov\teax, DWORD PTR _value$[ebp] \r\n\tadd\teax, 1 \r\n\tmov\tDWORD PTR _value$[ebp], eax   \r\n\r\n\tmov\tecx, DWORD PTR _value$[ebp] \r\n\tadd\tecx, 1 \r\n\tmov\tDWORD PTR _value$[ebp], ecx   \r\n\r\n\tmov\tedx, DWORD PTR _value$[ebp] \r\n\tadd\tedx, 1 \r\n\tmov\tDWORD PTR _value$[ebp], edx<\/pre>\n<p>If you know a little bit assembly language you can see that in the first case value is incremented after each evaluation of foo&#8217;s arguments, and in the second case that happens only after the call to foo. After the call, in both cases, value becomes 4.<\/p>\n<p>To achieve the intended behavior you should write:<\/p>\n<pre class=\"prettyprint\">\r\nint main(int argc, char* argv[]) \r\n{ \r\n   int value = 1; \r\n   foo(value, value+1, value+2);\r\n   value += 3;\r\n\r\n   return 0; \r\n}<\/pre>\n<p>It should be quite obvious, that the same behavior is encountered if the call to foo was replaced with:<\/p>\n<pre class=\"prettyprint\">\r\nstd::cout &lt;&lt; value++ &lt;&lt; ' ' &lt;&lt; value++ &lt;&lt; ' ' &lt;&lt; value++ &lt;&lt; std::endl;<\/pre>\n<p>For more information about sequence points I suggest reading:<br \/>\n<a target=\"_blank\" href=\"http:\/\/en.wikipedia.org\/wiki\/Sequence_point\">http:\/\/en.wikipedia.org\/wiki\/Sequence_point<\/a><br \/>\n<a target=\"_blank\" href=\"http:\/\/c-faq.com\/expr\/seqpoints.html\">http:\/\/c-faq.com\/expr\/seqpoints.html<\/a><br \/>\n<a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/d45c7a5d(VS.80).aspx\">http:\/\/msdn2.microsoft.com\/en-us\/library\/d45c7a5d(VS.80).aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Consider the following C++ code: void foo(int a, int b, int c) { std::cout &lt;&lt; a &lt;&lt; &#8216; &#8216; &lt;&lt; b &lt;&lt; &#8216; &#8216; &lt;&lt; c &lt;&lt; std::endl; } int main(int argc, char* argv[]) { int value = 1; foo(value++, value++, value++); return 0; } That looks pretty straight-forward: there is a function that takes &#8230; <a title=\"Beware of Sequence Points\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/\" aria-label=\"Read more about Beware of Sequence Points\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[],"class_list":["post-83","post","type-post","status-publish","format-standard","hentry","category-c"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Beware of Sequence Points\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2007-09-19T07:31:44+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2007-09-19T08:05:43+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Beware of Sequence Points\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#article\",\"name\":\"Beware of Sequence Points\",\"headline\":\"Beware of Sequence Points\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2007-09-19T02:31:44+02:00\",\"dateModified\":\"2007-09-19T03:05:43+02:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#webpage\"},\"articleSection\":\"C++\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#listItem\",\"name\":\"Beware of Sequence Points\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#listItem\",\"position\":5,\"name\":\"Beware of Sequence Points\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/\",\"name\":\"Beware of Sequence Points\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/09\\\/19\\\/beware-of-sequence-points\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2007-09-19T02:31:44+02:00\",\"dateModified\":\"2007-09-19T03:05:43+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Beware of Sequence Points","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#article","name":"Beware of Sequence Points","headline":"Beware of Sequence Points","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2007-09-19T02:31:44+02:00","dateModified":"2007-09-19T03:05:43+02:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#webpage"},"articleSection":"C++"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#listItem","name":"Beware of Sequence Points"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#listItem","position":5,"name":"Beware of Sequence Points","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/","name":"Beware of Sequence Points","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2007-09-19T02:31:44+02:00","dateModified":"2007-09-19T03:05:43+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Beware of Sequence Points","og:url":"https:\/\/mariusbancila.ro\/blog\/2007\/09\/19\/beware-of-sequence-points\/","article:published_time":"2007-09-19T07:31:44+00:00","article:modified_time":"2007-09-19T08:05:43+00:00","twitter:card":"summary","twitter:title":"Beware of Sequence Points"},"aioseo_meta_data":{"post_id":"83","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:10:26","updated":"2025-12-12 07:14:11","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"Consider the following C++ code: void foo(int a, int b, int c) { std::cout &lt;&lt; a &lt;&lt; ' ' &lt;&lt; b &lt;&lt; ' ' &lt;&lt; c &lt;&lt; std::endl; } int main(int argc, char* argv[]) { int value = 1; foo(value++, value++, value++); return 0; } That looks pretty straight-forward: there is a function that takes&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 19 years ago","modified":"Updated 19 years ago"},"absolute_dates":{"created":"Posted on September 19, 2007","modified":"Updated on September 19, 2007"},"absolute_dates_time":{"created":"Posted on September 19, 2007 2:31 am","modified":"Updated on September 19, 2007 3:05 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-1l","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=83"}],"version-history":[{"count":0,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/83\/revisions"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}